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

可以在FormClose中結束thread嗎?

尚未結案
chilung
一般會員


發表:4
回覆:13
積分:3
註冊:2003-03-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-06 17:35:53 IP:140.92.xxx.xxx 未訂閱
各位大哥: 小弟我目前寫了一隻multithread的程式.thread卻無法結束掉. 我已看過此討論區的一些相關文章. 目前我是在FormClose()中,把thread做suspend然後terminate. 並且也如法炮製寫了一個ThreadDone的函式. 讓OnTerminate指向此函式. 可是,實際的情形是.我的FormClose執行結束後.Thread還在, 且似乎並沒有去執行ThreadDone函式. 我實在想不出來是什麼原因.煩請各位先進, 若有人知道原因為何,可以不吝賜教. 謝謝大家的幫忙.
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-06 17:53:27 IP:61.221.xxx.xxx 未訂閱
引言: 小弟我目前寫了一隻multithread的程式.thread卻無法結束掉. 我已看過此討論區的一些相關文章. 目前我是在FormClose()中,把thread做suspend然後terminate. 並且也如法炮製寫了一個ThreadDone的函式. 讓OnTerminate指向此函式. 可是,實際的情形是.我的FormClose執行結束後.Thread還在, 且似乎並沒有去執行ThreadDone函式. 我實在想不出來是什麼原因.煩請各位先進, 若有人知道原因為何,可以不吝賜教. 謝謝大家的幫忙.
chilung 你好: (1)請問你是如何確認你的 thread 尚未結束呢?? ( > --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
chilung
一般會員


發表:4
回覆:13
積分:3
註冊:2003-03-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-06 18:38:22 IP:140.92.xxx.xxx 未訂閱
引言: chilung 你好: (1)請問你是如何確認你的 thread 尚未結束呢?? ( > < face="Verdana, Arial, Helvetica"> 感謝RaynorPao的回覆. 我是從BCB的debug tool中的thread status看thread還在不在的.. 我目前是這樣做(部分程式碼如下)..希望對您了解問題有幫助 void __fastcall TMainForm::FormCreate(TObject *Sender) { receiver = new Receiver(true) ;//chilung 2003/01/03 sender = new send_install_data(true) ; //chilung 2003/02/17 receiver->FreeOnTerminate = true ; sender->FreeOnTerminate = true ; receiver->OnTerminate = ThreadDone; sender->OnTerminate = ThreadDone; } void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action) { if(receiver->Suspended==false) {receiver->Suspend();} if(sender->Suspended==false) {sender->Suspend();} receiver->Terminate() ; sender->Terminate() ; } void __fastcall TMainForm::ThreadDone(TObject *Sender) { delete sender ; delete receiver ; } 謝謝大家的熱心幫忙~ 發表人 - chilung 於 2003/03/06 18:42:49
wj77
一般會員


發表:0
回覆:9
積分:6
註冊:2003-02-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-06 23:04:58 IP:61.224.xxx.xxx 未訂閱
我覺得問題應該出在你的TThread::Execute()中 可能沒有跳出該迴圈導致thread無法結束 另外,不知你有沒有注意到一點 你把FreeOnTerminate設為true 且在OnTerminate的函數中去delete該thread 如果你的thread真的結束了 也應該會出現memory錯誤哦
chilung
一般會員


發表:4
回覆:13
積分:3
註冊:2003-03-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-07 09:55:58 IP:140.92.xxx.xxx 未訂閱
引言: 我覺得問題應該出在你的TThread::Execute()中 可能沒有跳出該迴圈導致thread無法結束 另外,不知你有沒有注意到一點 你把FreeOnTerminate設為true 且在OnTerminate的函數中去delete該thread 如果你的thread真的結束了 也應該會出現memory錯誤哦
謝謝wj77的回覆.首先 (1) 我也是懷疑沒有跳出迴圈. 但是,for example,以下是我其中一個thread的exeucute void __fastcall Receiver::Execute() { //---- Place thread code here ---- Synchronize(Listener) ; while(!Terminated) { Listener() ; Sleep(50) ; } } 我在Listener()中雖然有loop,不過我有設time out.應該會離開才是. 啊..還是說..把這個 >...不太瞭解說..我等一下試看看好了.. ( > 我會修正的. 再次感謝大家的熱情相助~~< >
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-07 11:15:56 IP:61.231.xxx.xxx 未訂閱
以下是 Thread VCL 的原始碼片段:
function ThreadProc(Thread: TThread): Integer;
var
  FreeThread: Boolean;
begin
  try
    Thread.Execute;
  finally
    FreeThread := Thread.FFreeOnTerminate;
    Result := Thread.FReturnValue;
    Thread.FFinished := True;
    Thread.DoTerminate;
    if FreeThread then Thread.Free;
    EndThread(Result);
  end;
end;
如果你所設定的 OnTerminate 沒有執行到,那就表示,你的 Thread 還在 Execute 當中。同時,由以上的碼也可以知道,當你已設定 FreeOnTerminate 時,就不需要自己 delete 了(Delphi 的 .Free 與 BCB 的 delete 應該是相同的)。在 Execute 中有迴圈要判斷 Thread 是否 Terminate,如果可以,在其叫用的函式內含 Thread 的也要判斷,這樣反應較快。用 TimeOut 當然也行,不過,發生時,會怪怪的,好像短暫當機一樣(其實是在等你設的 TimeOUT)。另外,其實不必先 Suspend 再 Terminate,通常會 Suspend 是在需要修改執行緒的優先權或是真的暫時停止運作時才需要叫用,都要關閉了,就直接叫用 Terminate 就好。 沒空更新的網頁... http://coolsite.to/dllee C及指標教學,計算機概論,資訊管理導論... http://home.kimo.com.tw/dllee.tw http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
chilung
一般會員


發表:4
回覆:13
積分:3
註冊:2003-03-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-24 14:05:49 IP:140.92.xxx.xxx 未訂閱
很抱歉這麼久才回覆. 很謝謝大家的幫忙. 我想的確應該是thread沒有結束所造成的. 但是最近有其他的事,還沒試著去debug. 我會再去努力的試試看的. 我看了一下回覆者的分數.似乎除了wj77之外.都好高喔. 所以我想把這次的分數給
系統時間:2024-05-04 23:15:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!