可以在FormClose中結束thread嗎? |
尚未結案
|
chilung
一般會員 發表:4 回覆:13 積分:3 註冊:2003-03-06 發送簡訊給我 |
各位大哥:
小弟我目前寫了一隻multithread的程式.thread卻無法結束掉.
我已看過此討論區的一些相關文章.
目前我是在FormClose()中,把thread做suspend然後terminate.
並且也如法炮製寫了一個ThreadDone的函式.
讓OnTerminate指向此函式.
可是,實際的情形是.我的FormClose執行結束後.Thread還在,
且似乎並沒有去執行ThreadDone函式.
我實在想不出來是什麼原因.煩請各位先進,
若有人知道原因為何,可以不吝賜教.
謝謝大家的幫忙.
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 小弟我目前寫了一隻multithread的程式.thread卻無法結束掉. 我已看過此討論區的一些相關文章. 目前我是在FormClose()中,把thread做suspend然後terminate. 並且也如法炮製寫了一個ThreadDone的函式. 讓OnTerminate指向此函式. 可是,實際的情形是.我的FormClose執行結束後.Thread還在, 且似乎並沒有去執行ThreadDone函式. 我實在想不出來是什麼原因.煩請各位先進, 若有人知道原因為何,可以不吝賜教. 謝謝大家的幫忙.chilung 你好: (1)請問你是如何確認你的 thread 尚未結束呢?? ( > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
chilung
一般會員 發表:4 回覆:13 積分:3 註冊:2003-03-06 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
chilung
一般會員 發表:4 回覆:13 積分:3 註冊:2003-03-06 發送簡訊給我 |
引言: 我覺得問題應該出在你的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 發送簡訊給我 |
以下是 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |