2013-10-29 39 views
0

我正在爲Windows編寫一個簡單的線程庫。我想這種方式傳遞函子如何在不使用C++ 11線程的情況下使用functor作爲線程函數在窗口中開始線程?

struct callable 
{ 
    void operator()() 
    { 
     for(int i = 0; ;++i) 
     { 
      std::cout << i << std::endl; 
     } 
    } 
}; 

_beginthread()

int main() 
{ 
    callable c; 
    _beginthread(c, 0, 0); 
} 

但是這是不可能的。在線程中傳遞函子的能力對我的庫非常必要。我知道boost::thread提供這種能力,因此它是可能的。如何在不使用C++ 11線程的情況下使用functor作爲線程函數在窗口中開始線程?

[UPD]不使用C++ 11螺紋

回答

1

標準技術如下:

  • 定義一個結構以保持需要傳遞給線程的任何信息。在你的情況下,該信息是可調用函子。所以,你已經有了一個合適的結構。
  • 在堆上分配這些結構中的一個。這發生在調用線程中,但是信息被傳遞到創建的線程,這就是爲什麼它不能在棧中生存。
  • 調用CreateThread傳遞一個合適的線程proc(稍後),以及您的結構在lpParameter參數中的地址。
  • 在線程處理程序中,您傳遞的結構地址爲lpParameter
  • 將指針轉換爲適當的類型並調用您的函子。
  • 刪除堆分配的內存。

線程PROC看起來是這樣的:

DWORD WINAPI ThreadProc(void *lpParameter) 
{ 
    callable *c = (callable*)lpParameter; 
    (*c)(); 
    delete c; 
    return 0; 
} 

並調用CreateThread是沿着這些線路:

callable *c = new callable; 
// initialise c 
CreateThread(NULL, 0, ThreadProc, (void*)c, 0, &threadID); 

我道歉,如果這裏有語法錯誤,我不是精通C++。

相關問題