Thread安全的強制退出? |
答題得分者是:aftcast
|
deanmac85
一般會員 ![]() ![]() 發表:13 回覆:4 積分:3 註冊:2007-05-29 發送簡訊給我 |
.H檔
[code cpp] class TMyThread : public TThread { public: __fastcall TMyThread(bool CreateSuspended); void __fastcall ShowMemo(void); protected: void __fastcall Execute(void); }; [/code] .CPP檔 [code cpp] #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TMyThread *MyThread; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Memo1->Lines->Clear(); } //--------------------------------------------------------------------------- __fastcall TMyThread::TMyThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::Execute(void) { while (true) { Sleep(1); if( Terminated ){ break; } Synchronize(ShowMemo); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (MyThread) MyThread->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { MyThread = new TMyThread(false); MyThread->FreeOnTerminate=true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::ShowMemo(void) { int iMemo = 0 ; while(1) { Application->ProcessMessages(); Sleep(500); iMemo = 100; Form1->Memo1->Lines->Add("Memo" IntToStr(iMemo)); Application->ProcessMessages(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { MyThread->Terminate(); } [/code] 如果不要在ShowMemo function內做任何判斷的話 以上還有什麼辦法可以停止 Show在Memo1上的文字 按下 Button3 Terminate 似乎沒有任何作用 因為 目前還在無窮迴圈內 |
AndrewK
高階會員 ![]() ![]() ![]() ![]() 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
可以參考看看
showmemo function 的寫法 試著將 Thread Execute function 加入幾行code ===================引 用 deanmac85 文 章=================== .H檔 [code cpp] class TMyThread : public TThread { public: __fastcall TMyThread(bool CreateSuspended); void __fastcall ShowMemo(void); protected: void __fastcall Execute(void); }; [/code] .CPP檔 [code cpp] #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TMyThread *MyThread; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Memo1->Lines->Clear(); } //--------------------------------------------------------------------------- __fastcall TMyThread::TMyThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::Execute(void) { while (true) { Sleep(1); if( Terminated ){ break; } Synchronize(ShowMemo); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (MyThread) MyThread->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { MyThread = new TMyThread(false); MyThread->FreeOnTerminate=true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::ShowMemo(void) { int iMemo = 0 ; while(1) { Application->ProcessMessages(); Sleep(500); iMemo = 100; Form1->Memo1->Lines->Add("Memo" IntToStr(iMemo)); Application->ProcessMessages(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { MyThread->Terminate(); } [/code] 如果不要在ShowMemo function內做任何判斷的話 以上還有什麼辦法可以停止 Show在Memo1上的文字 按下 Button3 Terminate 似乎沒有任何作用 因為 目前還在無窮迴圈內
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
deanmac85
一般會員 ![]() ![]() 發表:13 回覆:4 積分:3 註冊:2007-05-29 發送簡訊給我 |
小弟知道Thread Execute function內加入判斷
但這幾天試的結果 似乎也是沒有將thread停下來 不知道你的作法會是如何?可以將thread停下來 並安全的釋放記憶體 ===================引 用 AndrewK 文 章=================== 可以參考看看 showmemo function 的寫法 試著將 Thread Execute function 加入幾行code ===================引 用 deanmac85 文 章=================== .H檔 [code cpp] class TMyThread : public TThread { public: __fastcall TMyThread(bool CreateSuspended); void __fastcall ShowMemo(void); protected: void __fastcall Execute(void); }; [/code] .CPP檔 [code cpp] #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TMyThread *MyThread; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Memo1->Lines->Clear(); } //--------------------------------------------------------------------------- __fastcall TMyThread::TMyThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::Execute(void) { while (true) { Sleep(1); if( Terminated ){ break; } Synchronize(ShowMemo); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (MyThread) MyThread->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { MyThread = new TMyThread(false); MyThread->FreeOnTerminate=true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::ShowMemo(void) { int iMemo = 0 ; while(1) { Application->ProcessMessages(); Sleep(500); iMemo = 100; Form1->Memo1->Lines->Add("Memo" IntToStr(iMemo)); Application->ProcessMessages(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { MyThread->Terminate(); } [/code] 如果不要在ShowMemo function內做任何判斷的話 以上還有什麼辦法可以停止 Show在Memo1上的文字 按下 Button3 Terminate 似乎沒有任何作用 因為 目前還在無窮迴圈內 |
AndrewK
高階會員 ![]() ![]() ![]() ![]() 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
您可以試試看
Thread Execute function 內加入 Application->ProcessMessages(); 再按下 button3 中斷 再利用一個 label 當Thread 的狀態欄查看 當 Thread isTerminate 時 label 顯示 False 看看是否可以解決你的問題 ===================引 用 deanmac85 文 章=================== 小弟知道Thread Execute function內加入判斷 但這幾天試的結果 似乎也是沒有將thread停下來 不知道你的作法會是如何?可以將thread停下來 並安全的釋放記憶體 ===================引 用 AndrewK 文 章=================== 可以參考看看 showmemo function 的寫法 試著將 Thread Execute function 加入幾行code ===================引 用 deanmac85 文 章=================== .H檔 [code cpp] class TMyThread : public TThread { public: __fastcall TMyThread(bool CreateSuspended); void __fastcall ShowMemo(void); protected: void __fastcall Execute(void); }; [/code] .CPP檔 [code cpp] #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TMyThread *MyThread; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Memo1->Lines->Clear(); } //--------------------------------------------------------------------------- __fastcall TMyThread::TMyThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::Execute(void) { while (true) { Sleep(1); if( Terminated ){ break; } Synchronize(ShowMemo); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (MyThread) MyThread->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { MyThread = new TMyThread(false); MyThread->FreeOnTerminate=true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::ShowMemo(void) { int iMemo = 0 ; while(1) { Application->ProcessMessages(); Sleep(500); iMemo = 100; Form1->Memo1->Lines->Add("Memo" IntToStr(iMemo)); Application->ProcessMessages(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::c(TObject *Sender) { MyThread->Terminate(); } [/code] 如果不要在ShowMemo function內做任何判斷的話 以上還有什麼辦法可以停止 Show在Memo1上的文字 按下 Button3 Terminate 似乎沒有任何作用 因為 目前還在無窮迴圈內
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
deanmac85
一般會員 ![]() ![]() 發表:13 回覆:4 積分:3 註冊:2007-05-29 發送簡訊給我 |
當按下Button3 Thread Execute function並沒有結束
所以是沒有進入判斷Terminate break 掉 看來好像無解了.... ===================引 用 AndrewK 文 章=================== 您可以試試看 Thread Execute function 內加入 Application->ProcessMessages(); 再按下 button3 中斷 再利用一個 label 當Thread 的狀態欄查看 當 Thread isTerminate 時 label 顯示 False 看看是否可以解決你的問題 |
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你整個想法都出錯了,所以才會無解。正解應該是:
// while(1) //不能在這裡無窮loop //{ //Application->ProcessMessages(); //不需在main form裡加這行程式碼 // 注:sync的這段程式碼其實是在mainform上執行的 //Sleep(500); //不能在main中使用sleep iMemo = 100; Form1->Memo1->Lines->Add("Memo" IntToStr(iMemo)); //Application->ProcessMessages(); //無需用 // } //把成來的 Synchronize(ShowMemo); 這行改成如下 while(!Terminated) { Synchronize(ShowMemo); Sleep(500); } //改好後最慢500ms就可以離開thread
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-05-27 19:34:21, 註解 無‧
|
deanmac85
一般會員 ![]() ![]() 發表:13 回覆:4 積分:3 註冊:2007-05-29 發送簡訊給我 |
其實也不算我想法都出錯
我只想試看看 我這樣的寫法 有辦法去cancel掉 thread 因為目前正在實作 thread內去呼叫 dll function 因為dll 我這邊沒辦法控制 有時候一進去dll function後 就出不來了 所以想辦法把thread kill掉 因該thread停掉 function處理程序應該會停止 不知道有什麼辦法 我寫的就是類似 進去function而出不來的話 有沒有相關處理機制 不過....感謝你的正解...... ===================引 用 aftcast 文 章=================== 你整個想法都出錯了,所以才會無解。正解應該是: // while(1) //不能在這裡無窮loop //{ //Application->ProcessMessages(); //不需在main form裡加這行程式碼 // 注:sync的這段程式碼其實是在mainform上執行的 //Sleep(500); //不能在main中使用sleep iMemo = 100; Form1->Memo1->Lines->Add("Memo" IntToStr(iMemo)); //Application->ProcessMessages(); //無需用 // } //把成來的 Synchronize(ShowMemo); 這行改成如下 while(!Terminated) { Synchronize(ShowMemo); Sleep(500); } //改好後最慢500ms就可以離開thread |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |