2016-06-01 11 views
0

以下は私のコードですが、私の問題はreadEvent()関数が呼び出されないことです。Pthreadループ関数が呼び出されることはありません

Header file 

class MyServer 
{ 

    public : 

     MyServer(MFCPacketWriter *writer_); 

     ~MyServer(); 

     void startReading(); 

     void stopReading(); 

    private : 

     MFCPacketWriter *writer; 
     pthread_t serverThread; 
     bool stopThread; 



     static void *readEvent(void *); 
}; 

CPP file 

MyServer::MyServer(MFCPacketWriter *writer_):writer(writer_) 
{ 
    serverThread = NULL; 
    stopThread = false; 
    LOGD(">>>>>>>>>>>>> constructed MyServer "); 

} 

MyServer::~MyServer() 
{ 
    writer = NULL; 
    stopThread = true; 

} 

void MyServer::startReading() 
{ 
    LOGD(">>>>>>>>>>>>> start reading"); 
    if(pthread_create(&serverThread,NULL,&MyServer::readEvent, this) < 0) 
    { 
     LOGI(">>>>>>>>>>>>> Error while creating thread"); 
    } 
} 

void *MyServer::readEvent(void *voidptr) 
{ 
    // this log never gets called 
    LOGD(">>>>>>>>>>>>> readEvent"); 
    while(!MyServer->stopThread){ 

     //loop logic 
    } 

} 

Another class 

    MyServer MyServer(packet_writer); 
    MyServer.startReading(); 
+0

'std :: thread'を使用していない理由はありますか? – Tas

+0

非常に古いツールチェーンで作業しています。アンドロイドはstd :: threadをサポートしていません – Yuvi

答えて

0

あなたがpthread_joinを呼び出していないので、あなたのメインスレッドが終了するのあなたのワーカースレッドを待たずに終了します。ここで

は、問題を再現簡略化した例である。このプログラムを実行するとき

#include <iostream> 
#include <pthread.h> 

class Example { 
public: 
    Example() : thread_() { 
    int rcode = pthread_create(&thread_, nullptr, Example::task, nullptr); 
    if (rcode != 0) { 
     std::cout << "pthread_create failed. Return code: " << rcode << std::endl; 
    } 
    } 

    static void * task (void *) { 
    std::cout << "Running task." << std::endl; 
    return nullptr; 
    } 

private: 
    pthread_t thread_; 
}; 

int main() { 
    Example example; 
} 

View Results

ませ出力はpthread_createが正常に機能パラメータとしてExample::taskと呼ばれていたにも関わらず、生成されません。

この

はスレッドで pthread_joinを呼び出すことによって固定することができます。

#include <iostream> 
#include <pthread.h> 

class Example { 
public: 
    Example() : thread_() { 
    int rcode = pthread_create(&thread_, nullptr, Example::task, nullptr); 
    if (rcode != 0) { 
     std::cout << "pthread_create failed. Return code: " << rcode << std::endl; 
    } 
    } 

    /* New code below this point. */ 

    ~Example() { 
    int rcode = pthread_join(thread_, nullptr); 
    if (rcode != 0) { 
     std::cout << "pthread_join failed. Return code: " << rcode << std::endl; 
    } 
    } 

    /* New code above this point. */ 

    static void * task (void *) { 
    std::cout << "Running task." << std::endl; 
    return nullptr; 
    } 

private: 
    pthread_t thread_; 
}; 

int main() { 
    Example example; 
} 

View Results

は今、プログラムが期待される出力を生成します。

タスクを実行します。あなたのケースでは

、あなたはあなたのMyServerクラスのデストラクタにpthread_joinへの呼び出しを追加することができます。

関連する問題