2010-06-02 84 views
0

基本上我有一個類,它是instincable(不是靜態的)。基本上我希望班級能夠生成自己的線程並管理自己的東西。我不想爲每個我創建的實例進行全局回調,這對我來說似乎並不乾淨。做我想做的事的正確方法是什麼?如果我嘗試將threadproc傳遞給CreateThread,並且它是來自類實例的proc,編譯器會說我不能這樣做。什麼是實現我想要的最好方式?謝謝線程處理一個instancable類?

+2

不要重新發明輪子,查看現有庫的來源,如boost :: thread,Qt,ACE等。這已經完成了很多次。 – 2010-06-02 02:23:11

回答

0
class Obj 
{ 
    static ULONG WINAPI ThreadProc(void* p) 
    { 
     Obj* pThis = (Obj*)p; 
     ... do stuff ... 
     return 0; 
    } 

    void StartMemberThread() 
    { 
     CreateThread(... ThreadProc, this, ...); 
    } 
}; 

最棘手的部分是確保線程不使用pThis後對象消失。

+0

我見過do-while循環,但從來沒有做過什麼。 – 2015-11-12 13:06:30

0

你想要做的是創建一個靜態成員方法,反過來調用threadproc成員。它需要一個指向類實例的指針來進行該調用,因此您需要將(this)作爲(void *)參數傳遞給CreateThread。

0

爲什麼在使用簡單的跨平臺解決方案(如boost::thread庫)時使用WIN32線程?這完全消除了你的問題。但是,如果您使用WIN32(或pthreads),則可以指定一個應該傳遞給線程例程的void *參數。所以,void *對象可以是一個指向類的指針;只需將其重新轉換爲線程例程中的正確類型即可。一旦將void *轉換回類型化指針,就可以調用該對象的成員函數。

P.S.這個詞是「可實例化」的。