2012-10-17 58 views
1

我不明白爲什麼下一個代碼不起作用。它編譯正確,但不輸出任何內容。你可以幫我嗎?具有等待功能的簡單線程

HANDLE hEvent; 
unsigned int WINAPI MyThread(void *p) 
{ 
    WaitForSingleObject(hEvent, INFINITE); 
    _tprintf(TEXT("%s\n"),p); 
    return 0; 
} 

int _tmain(int argc, TCHAR *argv[]) 
{ 
    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
    unsigned int ThreadID; 
    HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, MyThread, L"hello world", 0, &ThreadID); 
    SetEvent(hEvent); 
    return 0; 
} 

回答

1

我的猜測是應用程序在print語句甚至觸發之前退出。您設置了該事件,然後立即退出。在退出之前嘗試等待線程完成。您應該能夠使用_beginthreadex返回的句柄。

HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, MyThread, L"hello world", 0, &ThreadID); 
SetEvent(hEvent); 
WaitForSingleObject(hThread1, INFINITE); 

注:我只是用無限的超時爲例,一般你可能不希望無限可能導致死鎖等。每個情況下需要進行檢查,以確定正確的行爲。在這裏,因爲你只是寫信給控制檯,如果這幾秒鐘沒有返回,可能是錯誤的。您可以修改代碼來檢查WaitForSingleObject的返回值,以查看它是否由於超時而退出,然後根據該值做出決定(例如記錄錯誤或有助於診斷出錯的內容)

1

程序在線程開始之前停止。

0

Put這在你的return 0;前,你應該得到一些結果

DWORD retVal; 
GetExitCodeThread(hThread1, &retVal); 

while(retVal == STILL_ACTIVE) { 
    Sleep(1000); 
    GetExitCodeThread(hThread1, &retVal); 
} 

retVal的也將幫助你看到你的線程如何結束(因爲你有不同的退出代碼,例如_endthreadex(6);

+2

這是可行的,但我會認爲等待線程處理會更好。特別是如果有人出現並編輯線程方法,使其具有像'_endthreadex(259);'當然這將是邪惡的線:) – pstrjds

+0

你是絕對正確的,對於那些想知道他的意思是由exitcode 259它是什麼意思是STILL_ACTIVE的值,這意味着如果返回259,雖然線程結束,但while循環將爲true。 – 2012-10-17 18:57:08