看板 C_and_CPP 關於我們 聯絡資訊
之前想用SetTimer來處理Timeout的問題 而有板友建議我使用WaitForSingleObject 而我目前用WaitForSingleObject有點小問題 程式碼如下: #include <iostream> #include <windows.h> using namespace std; HANDLE ThreadID; HANDLE TimeoutEvent; void Timeout() { while (WaitForSingleObject(TimeoutEvent, 1000) != WAIT_TIMEOUT); cout <<"Timeout " <<endl; ExitThread((unsigned long)ThreadID); } int main(int argc, char **argv) { /*Create Event*/ TimeoutEvent = CreateEvent(NULL, false, false, "Test"); /*Create Thread to Check Timeout or not*/ CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Timeout, NULL, 0, (unsigned long *)ThreadID); WaitForSingleObject(ThreadID, INFINITE); system("pause"); return 0; } 我很好奇它輸出的結果 為什麼它會先執行 system("pause") 而不會先顯示Timeout? 黃色那行的WaitForSingleObject不是會等到指定的Handle結束才會往下做嗎? 為什麼這邊卻先處理了 system("pause"); 還請各位指點一下,謝謝 -- ˍˍ 極目冷眼笑蒼雲 ▕寂寞▏ 寂寞一生傲蒼穹 ▕侯印▏  ̄ ̄ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.39.251
TeaEEE:CreateThread並不會"馬上"執行thread function 06/06 09:21
TeaEEE:Wait應該是等待CreateThread回傳的Handle才對不是等id 06/06 09:25
TeaEEE:正常情形下thread結束時習慣會用CloseHandel而非ExitThread 06/06 09:35
godman362:可以請問一下,所謂等Handle是指哪一個部份 06/06 10:09
godman362:ExitThread是我用錯了,謝謝指正 06/06 10:09
godman362:我剛剛測試了一下,T大您說的是CreateThread回傳的部份 06/06 10:31
godman362:呢? 06/06 10:31
godman362:我剛剛宣告了一個Handle去承接CreateThread的回傳值 06/06 10:32
godman362:然後將Handle丟給黃色的WaitForSingleObject當參數 06/06 10:32
godman362:您所說的是這樣的用法嗎? 06/06 10:32
UNARYvvv:三樓那句怪怪的,ExitThread 跟 CloseHandle 是兩回事 06/06 10:47
UNARYvvv:呼叫點一個是在新 thread 內,一個是在建立 thread 者 06/06 10:52
godman362:我查過ExitThread是暴力關閉Thread 06/06 10:55
godman362:那正常結束Thread的方法是什麼? 06/06 10:55
godman362:一般的有結束的Thread可以不用自行關閉它 06/06 10:56
godman362:那如果是while(true) 這種呢? 06/06 10:56
UNARYvvv:ExitThread 是讓 thread 自我結束 06/06 10:56
godman362:它會有正規的關閉方式嗎....還是要使用ExitThread暴力 06/06 10:56
UNARYvvv:CloseHandle是關閉建立者跟被建立之thread的連結而已, 06/06 10:57
UNARYvvv:正規的關閉就是你的 thread 做完事情就 return 或呼叫 06/06 10:58
UNARYvvv:ExitThread 呀 06/06 10:58
godman362:喔,這樣我瞭解ExitThread的意思了 06/06 10:58
godman362:但是我還是不太清楚所謂CloseHandle的解釋 06/06 10:59
godman362:「關閉建立者和被建立之Thread」這句是什麼意思? 06/06 10:59
godman362:可以麻煩再指點一下嗎 06/06 10:59
UNARYvvv:至於Wait的問題解法就是二樓那樣 HANDLE h=CreateThread 06/06 11:00
UNARYvvv:WaitForSingleObject(h, ... 06/06 11:01
UNARYvvv:所以原本的code根本不算有wait, 程式等於一路執行到 06/06 11:01
UNARYvvv:system("pause"); 06/06 11:01
UNARYvvv:thread id 跟 thread handle 是不同的東西,原本你等錯囉 06/06 11:02
godman362:嗯,這個部份我有改過了,改成像U大您所說得 06/06 11:03
godman362:那所謂CloseHandle是代表說我所指定的Handle 06/06 11:04
godman362:和原本的Thread或是Event斷絕關係,就無法使用了,是嗎 06/06 11:05
UNARYvvv:簡單說就是,若 h=CreateThread(...); 06/06 11:06
UNARYvvv:若呼叫 CloseHandle(h); 之後,就不能 WaitFor..(h) 了 06/06 11:06
UNARYvvv:所以我上面說CloseHandle是關閉兩者的關聯而已 06/06 11:07
godman362:瞭解了,感謝U大的指導 06/06 11:13