線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2517
推到 Plurk!
推到 Facebook!

WaitForMultipleObjects 的問題..

尚未結案
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-22 15:04:20 IP:211.76.xxx.xxx 未訂閱
請教一下各位先進 :    我寫了以下一段 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-23 19:01:42 IP:211.76.xxx.xxx 未訂閱
引言:
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;
我將紅色部分的 Code 改成以下:
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-23 19:43:12 IP:61.64.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?topic_id=43102
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-24 09:07:04 IP:203.66.xxx.xxx 未訂閱
引言: http://delphi.ktop.com.tw/topic.php?topic_id=43102
conundrum 您好 : 我已經找到原因了,並非同步的問題.. 是我在 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-24 14:26:56 IP:61.221.xxx.xxx 未訂閱
SouthWind 兄 確實利害 我只會兩件事,這也不會,那也不會 眼見不一定為真 喝喝 有意思 喝喝 不過 可以狗膽請問SouthWind 兄 是否有時間寫個電子報 整理一下 因為你數天來的文章 如寫電子報讓大家了解 應該會更有意義
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-27 14:30:03 IP:203.66.xxx.xxx 未訂閱
引言: SouthWind 兄 確實利害 我只會兩件事,這也不會,那也不會 眼見不一定為真 喝喝 有意思 喝喝 不過 可以狗膽請問SouthWind 兄 是否有時間寫個電子報 整理一下 因為你數天來的文章 如寫電子報讓大家了解 應該會更有意義
conundrum 兄 : 您太抬舉我了,我這種文筆與技術難登大雅之堂,在討論區貼貼心得分享比較適合我的級數.. (應該請
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-28 00:23:28 IP:61.64.xxx.xxx 未訂閱
speedup Sir 庵再找機會 凹看看 不過 先期待 SouthWind 兄 的作品 喝喝 先謝謝啦 喝喝
系統時間:2024-05-19 11:09:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!