[問題] WinAPI-WaitForSingleObject

看板C_and_CPP (C/C++)作者 (青)時間16年前 (2009/06/06 08:57), 編輯推噓1(1036)
留言37則, 3人參與, 最新討論串1/1
之前想用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

06/06 09:21, , 1F
CreateThread並不會"馬上"執行thread function
06/06 09:21, 1F

06/06 09:25, , 2F
Wait應該是等待CreateThread回傳的Handle才對不是等id
06/06 09:25, 2F

06/06 09:35, , 3F
正常情形下thread結束時習慣會用CloseHandel而非ExitThread
06/06 09:35, 3F

06/06 10:09, , 4F
可以請問一下,所謂等Handle是指哪一個部份
06/06 10:09, 4F

06/06 10:09, , 5F
ExitThread是我用錯了,謝謝指正
06/06 10:09, 5F

06/06 10:31, , 6F
我剛剛測試了一下,T大您說的是CreateThread回傳的部份
06/06 10:31, 6F

06/06 10:31, , 7F
呢?
06/06 10:31, 7F

06/06 10:32, , 8F
我剛剛宣告了一個Handle去承接CreateThread的回傳值
06/06 10:32, 8F

06/06 10:32, , 9F
然後將Handle丟給黃色的WaitForSingleObject當參數
06/06 10:32, 9F

06/06 10:32, , 10F
您所說的是這樣的用法嗎?
06/06 10:32, 10F

06/06 10:47, , 11F
三樓那句怪怪的,ExitThread 跟 CloseHandle 是兩回事
06/06 10:47, 11F

06/06 10:52, , 12F
呼叫點一個是在新 thread 內,一個是在建立 thread 者
06/06 10:52, 12F

06/06 10:55, , 13F
我查過ExitThread是暴力關閉Thread
06/06 10:55, 13F

06/06 10:55, , 14F
那正常結束Thread的方法是什麼?
06/06 10:55, 14F

06/06 10:56, , 15F
一般的有結束的Thread可以不用自行關閉它
06/06 10:56, 15F

06/06 10:56, , 16F
那如果是while(true) 這種呢?
06/06 10:56, 16F

06/06 10:56, , 17F
ExitThread 是讓 thread 自我結束
06/06 10:56, 17F

06/06 10:56, , 18F
它會有正規的關閉方式嗎....還是要使用ExitThread暴力
06/06 10:56, 18F

06/06 10:57, , 19F
CloseHandle是關閉建立者跟被建立之thread的連結而已,
06/06 10:57, 19F

06/06 10:58, , 20F
正規的關閉就是你的 thread 做完事情就 return 或呼叫
06/06 10:58, 20F

06/06 10:58, , 21F
ExitThread 呀
06/06 10:58, 21F

06/06 10:58, , 22F
喔,這樣我瞭解ExitThread的意思了
06/06 10:58, 22F

06/06 10:59, , 23F
但是我還是不太清楚所謂CloseHandle的解釋
06/06 10:59, 23F

06/06 10:59, , 24F
「關閉建立者和被建立之Thread」這句是什麼意思?
06/06 10:59, 24F

06/06 10:59, , 25F
可以麻煩再指點一下嗎
06/06 10:59, 25F

06/06 11:00, , 26F
至於Wait的問題解法就是二樓那樣 HANDLE h=CreateThread
06/06 11:00, 26F

06/06 11:01, , 27F
WaitForSingleObject(h, ...
06/06 11:01, 27F

06/06 11:01, , 28F
所以原本的code根本不算有wait, 程式等於一路執行到
06/06 11:01, 28F

06/06 11:01, , 29F
system("pause");
06/06 11:01, 29F

06/06 11:02, , 30F
thread id 跟 thread handle 是不同的東西,原本你等錯囉
06/06 11:02, 30F

06/06 11:03, , 31F
嗯,這個部份我有改過了,改成像U大您所說得
06/06 11:03, 31F

06/06 11:04, , 32F
那所謂CloseHandle是代表說我所指定的Handle
06/06 11:04, 32F

06/06 11:05, , 33F
和原本的Thread或是Event斷絕關係,就無法使用了,是嗎
06/06 11:05, 33F

06/06 11:06, , 34F
簡單說就是,若 h=CreateThread(...);
06/06 11:06, 34F

06/06 11:06, , 35F
若呼叫 CloseHandle(h); 之後,就不能 WaitFor..(h) 了
06/06 11:06, 35F

06/06 11:07, , 36F
所以我上面說CloseHandle是關閉兩者的關聯而已
06/06 11:07, 36F

06/06 11:13, , 37F
瞭解了,感謝U大的指導
06/06 11:13, 37F
文章代碼(AID): #1AARyD9r (C_and_CPP)
文章代碼(AID): #1AARyD9r (C_and_CPP)