2016-06-13 10 views
0

おはようございます!std :: threadでMVSE12のエラーC2248

私はマイクロソフトのVisual Studio ExpressでC++でマルチスレッドアプリケーションをコーディングしようとしています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; 
} 

これは、クラス

#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(); 
} 

の ".hの" ある問題があります私はそれを実行すると、この2つのエラーを私に与えます:

エラー1エラーC2248: 'std :: thread :: operator =':クラス 'std :: thread'で宣言されたプライベートメンバーにアクセスできないc:\ users \ damien \ documents \ visual studio 2012 \ projects \ recherche \ recherche \ datacollectorftl.h 233 1 Recherche

エラー4エラーC2248: 'std :: thread :: thread':クラス 'std :: thread' c:\ users \ damien \ documents \ visual studioで宣言されたプライベートメンバーにアクセスできない2012年のプロジェクト\ \ RECHERCHE \ RECHERCHE \ 233 1 RECHERCHE

datacollectorftl.h時間を節約するために、私はあなたにそれを伝えることができます:

  • .hには何も変更されません。
  • runDataCollectorメソッドの内容は何も変更されません。それが空である場合でも、私はまだ私は、私はクラスのメンバとして宣言しない場合、それは何も

を変更しない、

  • のstd ::スレッドdataCollectorThreadは、パブリックまたはプライベートすることができ、問題を得ました私はrunDataCollector()のスレッドにjoin()しないので、プログラムのクラッシュがあります。 getData()は別のソフトからデータを取得するwhile(true)関数です。

    この記事を読んでいただきありがとうございました。ありがとうございました。また、何か助けていただきありがとうございます。

  • +0

    あなたはどこかで 'dataCollectorFTL'をコピー・アサインしようとしています。もちろんあなたが投稿したコードではありません。 – LogicStuff

    +0

    両方のエラーが 'datacollectorftl.h 'の行番号233を強調表示します。その正確な行を投稿してください。コンパイラがどこに不平を言っているのかを知ることが難しくなりました。 –

    +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); 
      
  • 関連する問題