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

Thread安全的強制退出?

答題得分者是:aftcast
deanmac85
一般會員


發表:13
回覆:4
積分:3
註冊:2007-05-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-26 19:26:06 IP:122.147.xxx.xxx 未訂閱
.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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-27 07:57:29 IP:60.250.xxx.xxx 訂閱
可以參考看看
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-27 08:53:17 IP:210.68.xxx.xxx 未訂閱
小弟知道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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-27 12:05:31 IP:60.250.xxx.xxx 訂閱
您可以試試看
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-27 13:35:52 IP:210.68.xxx.xxx 未訂閱
當按下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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-27 19:31:13 IP:210.64.xxx.xxx 訂閱
你整個想法都出錯了,所以才會無解。正解應該是:

// 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-06-01 11:02:11 IP:210.68.xxx.xxx 未訂閱
其實也不算我想法都出錯
我只想試看看 我這樣的寫法
有辦法去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
系統時間:2024-04-19 15:49:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!