如何判斷執行緒已全都處理完成呢?? |
尚未結案
|
wangcw61
一般會員 發表:21 回覆:18 積分:7 註冊:2004-05-14 發送簡訊給我 |
可否請問各位前輩,
在執行緒當中,若是開啟一個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 發送簡訊給我 |
方法很多. (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)
在主緒中加一个变数 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 發送簡訊給我 |
謝謝您詳細的回覆!.
還可以再問您下列問題?
(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 發送簡訊給我 |
可能是我没有说清楚. 其实在什么地方加变数 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 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
完整的代码: (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 發送簡訊給我 |
引言: 我測試方法(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 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
|
wangcw61
一般會員 發表:21 回覆:18 積分:7 註冊:2004-05-14 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |