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

如何判斷執行緒已全都處理完成呢??

尚未結案
wangcw61
一般會員


發表:21
回覆:18
積分:7
註冊:2004-05-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-23 16:46:56 IP:211.75.xxx.xxx 未訂閱
可否請問各位前輩, 在執行緒當中,若是開啟一個storeprocedure的動作,如何判定每個storeprocedure的都有完成呢?? (1)storeprocedure動作 procedure TDATAPUT.Execute; begin with Form1 do begin ADOStoredProcCursor.Close; ADOStoredProcCursor.Open; end; end; (2)call 執行緒時的語法 var vSum: Array[0..10000] of TDATAPUT; for X :=1 to ADOQuery1.RecordCount do begin vSum[X-1] := TDATAPUT.Create(X-1); ADOQuery1.Next; end; (3)假設ADOQuery1.RecordCount = 3871;則ADOStoredProcCursor會被呼叫3871次同時置於stack中;如何才能判斷這3871次的storeprocedure都有執行完成呢? 謝謝大家的指教
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-23 17:43:04 IP:220.244.xxx.xxx 未訂閱
方法很多. (1) for i := 0 to 3870 do vSum[i].WaitFor; WaitFor会锁住主緒. 如果執行緒用时很长, 不要用(1) (2) 在執行緒加一个变数 Finished: boolean, 然后在Execute结束时设置 Finished := True; All_Finished := True; for i := 0 to 3870 do if vSum[i].Finished = False then All_Finished := False;
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-23 17:54:37 IP:220.244.xxx.xxx 未訂閱
(3) 在主緒中加一个变数 FinishedCount: integer, 然后在Execute结束时 Inc(主緒.FinishedCount); if FinishedCount = 3871 then ... else ... 另外, Multi-threading的程序要注意Synchronization的问题. 執行緒用到的控件是否thread-safe, 是否用TCriticalSection控制共享变数的读写等等, 这已超出了这个Post的范围了. 發表人 - yyu10 於 2005/02/23 17:56:01
wangcw61
一般會員


發表:21
回覆:18
積分:7
註冊:2004-05-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-23 18:12:28 IP:211.75.xxx.xxx 未訂閱
謝謝您詳細的回覆!. 還可以再問您下列問題? (1)所謂'在主緒中加一个变数' 是指在Constructor TDATAPUT.Create(TNO: Integer)中再多設一個變數嗎? (2)'然后在Execute结束时',是指在procedure TDATAPUT.execute內set 變數值的內容嗎? procedure TDATAPUT.Execute; begin with Form1 do begin ADOStoredProcCursor.Close; ADOStoredProcCursor.Open; end; Inc(TDATAPUT.FinishedCount); End;
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-23 19:01:55 IP:220.244.xxx.xxx 未訂閱
可能是我没有说清楚. 其实在什么地方加变数 FinishedCount 只需要满足一个条件, 让Form1(主緒)和所有執行緒都能读写. (1) TForm1 = class(TForm); ..... public FinishedCount: integer; end; 相应的: procedure TDATAPUT.Execute; begin with Form1 do begin ADOStoredProcCursor.Close; ADOStoredProcCursor.Open; Inc(FinishedCount); end; End; (2) TForm1 = class(TForm); ,,,,, end; var FinishedCount: integer; 相应的: procedure TDATAPUT.Execute; begin with Form1 do begin ADOStoredProcCursor.Close; ADOStoredProcCursor.Open; end; Inc(FinishedCount); End; (3) TDATAPUT = class(TThread); ,,,,, end; var FinishedCount: integer; 相应的: procedure TDATAPUT.Execute; 同(2).
wangcw61
一般會員


發表:21
回覆:18
積分:7
註冊:2004-05-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-25 10:53:47 IP:211.75.xxx.xxx 未訂閱
我測試方法(2),可是會出現"當非同步執行時,不可執行操作"的錯誤訊息!不知是那個地方出問題?
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-25 11:13:41 IP:203.14.xxx.xxx 未訂閱
完整的代码: (2) TForm1 = class(TForm); ,,,,, end; var FinishedCount: integer; CountGuard: TCriticalSection; implementation ... initialization CountGuard := TCriticalSection.Create; finalization CountGuard.Free; end; 相应的: procedure TDATAPUT.Execute; begin with Form1 do begin ADOStoredProcCursor.Close; ADOStoredProcCursor.Open; end; CountGuard.Acquire; Inc(FinishedCount); CountGuard.Release; End; 發表人 - yyu10 於 2005/02/25 11:19:20
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-25 12:29:09 IP:203.14.xxx.xxx 未訂閱
引言: 我測試方法(2),可是會出現"當非同步執行時,不可執行操作"的錯誤訊息!不知是那個地方出問題?
我注意到你在另一个Post里提了相同的问题, 其实在回答最上面的问题时, 我意识到你的程序可能存在结构性的问题, 所以我提醒了一下
引言: 另外, Multi-threading的程序要注意Synchronization的问题. 執行緒用到的控件是否thread-safe, 是否用TCriticalSection控制共享变数的读写等等, 这已超出了这个Post的范围了.
设计Multi-threading的程序的一个基本原则是要保证不同的緒不要同时读写同一个变数. 具体到你的程序, 有3点需要考虑: 1. TADOStoredProc, TADOTable是否thread-safe. 我不ADO系列的控件, 没法评价. 我用TTable, TStoredProc, 它们不是thread-safe, 所以每个緒需要专用的控件. 2. 每个緒需要有专用的Database session, 相当于TADOConnection. 3. 你用的Database要有能力支持simultaneous transactions. Oracle, SQL Server支持. 很久以前在Access97上写过类似程序, 没成功. 其他的Database就不清楚了. 涉及的方面太广, 要是有錯請見笑. Programming is a passion
wangcw61
一般會員


發表:21
回覆:18
積分:7
註冊:2004-05-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-25 13:03:41 IP:211.75.xxx.xxx 未訂閱
再與前輩您確認一下;所謂的專用的控件,是否表示每個緒不能執行同一個物件(ADOStoredProcCursor)嗎? ps:(1)您不要這麼客氣了.我的問題才請您不要見笑內~~ (2)謝謝您的指教 (3)我使用的database是ms-sql2000
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-25 14:48:41 IP:220.244.xxx.xxx 未訂閱
引言: 再與前輩您確認一下;所謂的專用的控件,是否表示每個緒不能執行同一個物件(ADOStoredProcCursor)嗎?
对, 緒1用Cursor1/Table1/Query1, 緒2用Cursor2/Table2/Query2, .... _________________________ Programming is a passion
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-25 14:57:03 IP:220.244.xxx.xxx 未訂閱
或者用TCriticalSection进行控制, 可以看看关于TCriticalSection, TMultiReadExclusiveWriteSynchronizer方面的文章. _________________________ Programming is a passion
wangcw61
一般會員


發表:21
回覆:18
積分:7
註冊:2004-05-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-25 15:20:07 IP:211.75.xxx.xxx 未訂閱
續問,是否可以利用create變數的query,table,storeprocedure? 若要代入參數,是否可用array的方式呢?
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-02-25 16:15:12 IP:220.244.xxx.xxx 未訂閱
对, 只要是Delphi允许的方式都可以, 根据需要和可能进行选择了. _________________________ Programming is a passion
系統時間:2024-05-19 8:48:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!