如何结束动态创建的线程我写的这个会出错&# |
尚未結案
|
eoisoft
一般會員 發表:20 回覆:12 積分:6 註冊:2004-11-24 發送簡訊給我 |
我动态创建的线程要如何结束它,我的做法,当我想结束时,通过一个EDIT的值来断定,当为1时结,也就是当我按下一个按钮后,就开始下面的代码,我用以下代码不行:
procedure TMainForm.ThreadDone(Sender: TObject); var i,ci:Integer; begin Dec(ThreadsRunning); ci:=strtoint(ComboCs.Text); for i:=0 to ci do begin if IDDL[i]<>nil then begin if TThe[i]<>nil then TThe[i].WaitFor; if IDDL[i].Connected then IDDL[i].Disconnect; freeandnil(IDDL[i]); end; end; Combocs.Enabled:=True; end;会出现'....句柄无效' 發表人 - eoisoft 於 2005/01/12 17:07:57 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
Skyer
高階會員 發表:43 回覆:111 積分:120 註冊:2002-04-04 發送簡訊給我 |
通常 Thread 的 Execute 都是這樣的架構的..
procedure TSendThread.Execute; begin while not self.Terminated do begin // 你的程式 end; end;可簡單利用 Terminate 來中止 Thread var thread: TSendThread; begin thread := TSendThread.Create(False); thread.FreeOnTerminate := True; // 中止 thread.Terminate; end;這樣在 Execute 內,while 的 condition 就會變成 false 而結束. -- Regards, Skyer
------
-- Regards, Skyer |
eoisoft
一般會員 發表:20 回覆:12 積分:6 註冊:2004-11-24 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
ThreadDone應該是您要指定給 TThe[i].OnTerminate 的 Procedure
也就是說 當該 Thread結束時會執行 ThreadDone 程序 一般而言Thread 可以在兩種情況下結束
1. TThread.Execute 中的動作作完了, 就自動結束 -> 執行 OnTerminate 程序
2. 利用TThread.Execute 中察看 TThread.Terminated 為 True時 (通常是在for/while/repeat等迴圈結構中察看), 表示外界希望此Thread結束, 則在Thread.Execute程式碼中 直接跳出結束 -> 執行 OnTerminate 程序
(請參考Skyer的範例) @瞭解越多.懂得越少@
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
procedure TMainForm.FormCreate(Sender: TObject); var I: Integer; begin //Initial TThe[] for I := 0 to Length(TThe)-1 do TThe[I] := nil; end; procedure TMainForm.ThreadDone(Sender: TObject); var i,ci:Integer; begin Dec(ThreadsRunning); ci:=strtoint(ComboCs.Text); for i:=0 to ci-1 do //有沒有可能超出範圍? begin if IDDL[i]<>nil then begin if TThe[i]<>nil then TThe[i].WaitFor; TThe[i] := nil;//清為nil if IDDL[i].Connected then IDDL[i].Disconnect; freeandnil(IDDL[i]); end; end; Combocs.Enabled:=True; end; procedure TYourThread.Create(CreateSuspended: Boolean); begin inherited; FreeOnTerminate := True; end; procedure TYourThread.Execute; begin while not Terminated do begin ... end; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |