WaitForMultipleObjects 的問題.. |
尚未結案
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
請教一下各位先進 : 我寫了以下一段 Code ,是 form 上一個 button 執行後會選取多個檔案,然後執行多個 Thread 併行處理,如果不加紅色的 WaitForMultipleObjects ,則 Thread 會正常 Terminate, 加上去以後, 所有的 Thread 都無法正常 Terminate , 讓我的程式進入 DeadLock 狀態 .. 想請問有什麼辦法可以偵測所有的 Thread 結束??
(Thread 執行簡單的 code,且無同步處理)..
procedure TTSKMapDataSrv.Button1Click(Sender: TObject); var i: integer; Handls: TWOHandleArray; begin if OpenDialog1.Execute then for i := 0 to OpenDialog1.Files.Count - 1 do // Create Thread with TMapDataInsertThread.Create(true) do begin Handls[i] := Handle; FileName := OpenDialog1.Files.Strings[i]; Resume; end; WaitForMultipleObjects(OpenDialog1.Files.Count, @Handls, true, INFINITE); ShowMessage('All Threads Terminated'); end;---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言:我將紅色部分的 Code 改成以下:procedure TTSKMapDataSrv.Button1Click(Sender: TObject); var i: integer; Handls: TWOHandleArray; begin if OpenDialog1.Execute then for i := 0 to OpenDialog1.Files.Count - 1 do // Create Thread with TMapDataInsertThread.Create(true) do begin Handls[i] := Handle; FileName := OpenDialog1.Files.Strings[i]; Resume; end; WaitForMultipleObjects(OpenDialog1.Files.Count, @Handls, true, INFINITE); ShowMessage('All Threads Terminated'); end; while WaitForMultipleObjects(OpenDialog1.Files.Count, @Handls, true,0) = WAIT_TIMEOUT do begin Application.ProcessMessages; end;就可以正常執行了結果也是對的,但是我有嘗試去取得WaitForMultipleObjects 的傳回值,都是 WAIT_FAILED ,此結果是否正常?? 是否 Main Thread 與繼承 TThread 的 Class 共用同一個 Message Queue,照成 Main Thread 使用 Wait Function 後進入無盡等待的 DeadLock?? ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: http://delphi.ktop.com.tw/topic.php?topic_id=43102conundrum 您好 : 我已經找到原因了,並非同步的問題.. 是我在 TThread 的 constructor 中加入了 OnTerminate := MyTerminateProc 這一行 Code,引述 Delphi On-line Help 的一段話 : The OnTerminate event handler is called in the context of the main thread, which means methods and properties can be called freely. 造成的原因是, TThread 中如果是在 Main Thread 上執行的 Code ,因碰到 Main Thread 執行 Wait Function (TimeOut 設定成 INFINITE)後進入無限循環的等待,造成所有的 Thread DeadLock .. 所以底下這個 Dirty Solution 才得以Work ,但結果是不可預期的, 因為競速的結果,造成只要有一個 Thread 在 WaitForMultipleObjects(OpenDialog1.Files.Count, @Handls, true,0) = WAIT_TIMEOUT 之後,Handle 失效,WaitForMultipleObjects 便會傳回 WAIT_FAILED 跳出迴圈.. 以結果來看,這段 Code 是不正確的.. while WaitForMultipleObjects(OpenDialog1.Files.Count, @Handls, true,0) = WAIT_TIMEOUT do begin Application.ProcessMessages; end;PS. 若有謬誤,請用力指正... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |