2011-05-07 76 views
2

我讀的線程談論我的問題就在這裏:win32 CreateThread,如何以C++類函數的形式調用lpStartAddress參數?

how to use CreateThread for functions which are class members

使用來自微軟的網站在這裏的代碼之後:
How to spawn console processes with redirected standard handles
我實現了這個解決辦法,但存在一些問題,如:

我需要使用lpvThreadParam參數

DWORD WINAPI GetAndSendInputThread(LPVOID lpvThreadParam) 

如何在RichieHindle建議的示例中實現此操作?在ThreadStart函數中?
也參數在bRunThread和hStdIn(從微軟的例子我啓動他們的構造函數的值,但是當我執行ThreadStart與GetAndSendInputThread的內容從微軟的例子,它接縫,值從未設置
我希望我是清楚的,基本上我希望能夠運行這個例子是C++類。

回答

2

好的。我想我知道你現在要去哪裏。怎麼樣這樣的事情。在類的構造函數創建管道中,然後使用你的類線程函數的hInputWrite手柄(稱爲從靜態線程功能。

class MyClass 
{ 
    HANDLE hInputWrite; 
    HANDLE hInputRead; 
    SECURITY_ATTRIBUTES sa; 

    MyClass() { 
     if (!CreatePipe(&hOutputReadTmp,&hOutputWrite,&sa,0)) 
      DisplayError("CreatePipe"); 
    } 

    static DWORD WINAPI StaticThreadStart(void* Param) 
    { 
     MyClass* This = (MyClass*) Param; 
     return This->ThreadStart(); 
    } 

    DWORD ThreadStart(void) 
    { 
     // Do stuff with hInputWrite handle here 
    } 

    void startMyThread() 
    { 
     DWORD ThreadID; 
     CreateThread(NULL, 0, StaticThreadStart, (void*) this, 0, &ThreadID); 
    } 
}; 

MyClass thread; 
thread.startMyThread(); 

(從RichieHindles answer

+0

謝謝謝謝謝謝謝謝! – user63898 2011-05-07 16:28:28

+0

很高興! :d – ralphtheninja 2011-05-07 16:48:49

1

只要改變StaticThreadStart通過它接收到真正的方法指針。

NB,如果你使用的是C或C++標準庫,你真的應該使用從MS擴展到C運行時的beginthread or beginthreadex,這些確保C/C++庫爲新線程正確初始化。

+0

beginthread的使用只在某些需要進行修改通常情況下,每個線程的CRT狀態在線程入口時被自動初始化,這是必要的,因爲CRT在許多線程(如線程池線程)上使用,而非由BeginThread創建。如果你有靜態鏈接到CRT(不推薦)*和*你的二進制文件是一個EXE或帶有DisableThreadLibraryCalls的DLL。 一般建議:不要靜態鏈接CRT。 – 2011-05-07 20:12:39

+0

@Martyn:當限制被刪除時,它很好。我想我應該重新閱讀我認識的API每十年左右的文檔:-) – Richard 2011-05-08 07:10:30

相關問題