全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1126
推到 Plurk!
推到 Facebook!

如何结束动态创建的线程我写的这个会出错&#

尚未結案
eoisoft
一般會員


發表:20
回覆:12
積分:6
註冊:2004-11-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-12 14:30:30 IP:222.77.xxx.xxx 未訂閱
我动态创建的线程要如何结束它,我的做法,当我想结束时,通过一个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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-12 22:29:51 IP:218.32.xxx.xxx 未訂閱
eoisoft 你好: 可能你的源碼很多...可是...你精簡的貼出這些源碼...看不太出來...您的問題 TThe ? (可能是 TThread Array) IDDL ?
Skyer
高階會員


發表:43
回覆:111
積分:120
註冊:2002-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-13 01:12:42 IP:220.139.xxx.xxx 未訂閱
通常 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-13 10:46:46 IP:222.77.xxx.xxx 未訂閱
引言: eoisoft 你好: 可能你的源碼很多...可是...你精簡的貼出這些源碼...看不太出來...您的問題 TThe ? (可能是 TThread Array) IDDL ?
谢谢您的回复! TThe是TTHREAD ARRAY; IDDL是Tidhttp array; 都是动态创建的
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-14 15:07:28 IP:219.68.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-14 18:37:24 IP:203.67.xxx.xxx 未訂閱
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;    
系統時間:2024-05-13 6:01:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!