2016-06-13 9 views
0

Добрый вечер всем!Ошибка C2248 в MVSE12 с std :: thread

Я пытаюсь код многопоточных приложения на С ++ с использованием Microsoft Visual Studio Express 2012

Идея нам о том, что «главная» функция вызова нить, которая будет работать «навсегда», с задачей обновление объекта.

Это главное:

#include "stdafx.h" 
#include <iostream> 
#include <windows.h> 
#include <cstdlib> 
#include <thread> 
#include <iostream>//debug only 
#include <fstream> //debug only 
#include "dataCollectorFTL.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    dataCollectorFTL dataCollector1; 

    //Launch thread which will run forever and get the data flows 
    dataCollector1.runDataCollector(); 


    while(true){ 
     //application running  
    } 

    return 0; 
} 

Это является ".h" класса

#ifndef DATACOLLECTORFTL_H_INCLUDED 
#define DATACOLLECTORFTL_H_INCLUDED 


#include <thread> 

class dataCollectorFTL { 

public: 

    void runDataCollector(); 

    void getData(); 


    //constructor, destructor 
    dataCollectorFTL(); 
    ~dataCollectorFTL(); 

private: 
    HANDLE hProcess; 
    std::thread dataCollectorThread; 

}; 

#endif // DATACOLLECTORFTL_H_INCLUDED 

И, наконец, ".cpp"

#include "stdafx.h" 
#include <iostream> 
#include <windows.h> 
#include <thread> 
#include "dataCollectorFTL.h" 


void dataCollectorFTL::runDataCollector(){ 

    //lauch a non-local thread 
    dataCollectorThread = std::thread(&dataCollectorFTL::getData, this); 
} 


void dataCollectorFTL::getData(){ 
    //some stuff  

} 

dataCollectorFTL::dataCollectorFTL(){ 
    //some stuff 
} 

dataCollectorFTL::~dataCollectorFTL(){ 

    dataCollectorThread.join(); 
} 

Проблема заключается в том что когда я запускаю его, он дает мне две ошибки:

Ошибка 1 ошибка C2248: 'std :: thread :: operator =': не может получить доступ к закрытому члену, объявленному в классе 'std :: thread' c: \ users \ damien \ documents \ visual studio 2012 \ projects \ recherche \ recherche \ datacollectorftl.h 233 1 Recherche

Ошибка 4 error C2248: 'std :: thread :: thread': не удается получить доступ к закрытому члену, объявленному в классе 'std :: thread' c: \ users \ damien \ documents \ visual studio 2012 \ Projects \ отборный \ отборный \ datacollectorftl.h 233 1 Recherche

Чтобы сэкономить время, я могу вам сказать, что:

  • включить в .h ничего не изменит
  • Содержание методов runDataCollector ничего не меняет. Даже если он пуст, я все еще есть проблемы
  • станд :: нить dataCollectorThread может быть публичным или частным порядком, он ничего

не изменится Если я не декларируют в качестве члена класса, я имеют сбой программы, потому что я не присоединяюсь() к потоку в runDataCollector(). И я не хочу присоединяться к нему, имеет функцию getData() - это некоторая (истинная) функция, в которой он получает данные из другого мягкого.

Благодарим вас за то, что вы потратили на это чтение, и еще раз спасибо за любую помощь.

+0

Вы пытаетесь скопировать-присваивать 'dataCollectorFTL' где-то. Конечно, не в коде, который вы опубликовали. – LogicStuff

+0

Обе ошибки выделяют строку # 233 в 'datacollectorftl.h'. Не могли бы вы разместить эту точную строку? Вам трудно понять, где компилятор жалуется. –

+0

Представленный код выглядит прекрасно; http://coliru.stacked-crooked.com/a/2c1af3a84792c771. Вы уверены, что не копируете родительский класс 'dataCollectorFTL' где-то, что приведет к ошибке, которую вы видите. Сделайте его операторы копирования и назначения частными, и сообщения об ошибках помогут диагностировать местоположение копии. Если нет, то [mcve] поможет здесь. – Niall

ответ

0

Когда вы передаете функцию в конструктор std::thread, она должна быть вызвана из области действия. Другими словами, если это функция-член, эта функция должна быть static. Вы все равно можете перейти в this - просто скажите функции, чтобы ожидать этого.

Другими словами:

  • Добавьте следующие объявления класса:

    private: 
    
        void getData(); // Moved from public! 
    
        static void myGetData(DataCollectorFTL *ftl); 
    
  • Написать myGetData:

    void DataCollectorFTL::myGetData(DataCollectorFTL *ftl) { 
        ftl->getData(); 
    } // DataCollectorFLT::myGetData(ftl) 
    
  • Изменить вызов std::thread()

    //lauch a non-local thread 
    dataCollectorThread = std::thread(&myGetData, this); 
    

 Смежные вопросы

  • Нет связанных вопросов^_^