請問一個多執行緒的Terminate及Synchronize的問題!! |
答題得分者是:RaynorPao
|
aredfish
一般會員 ![]() ![]() 發表:47 回覆:41 積分:17 註冊:2002-12-04 發送簡訊給我 |
各位大大好, 我有一個多執行緒的問題, 我把問題描述如下 1. 我有一個主程式, 在主程式的一開始我先設定Test *T3=new Test(true);
Test是我Thread的名稱, T3事整體變數, 因此在主程式中我都可以使用T3 2. 我新增了一個Thread Object給Test, 裡面的程式很簡單, 只有
Void ShowLiteral()
{
Form1->Label10->Caption = "Test Thread running";
} __fastcall Test::Test(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
Priority = tpNormal;
} void __fastcall Test::Execute()
{
//---- Place thread code here ----
while(!Terminated)
{
Synchronize(ShowLiteral());
}
Form1->Label10->Caption = "Terminate Test Thread!!";
} 問題: 1. 可是上面的程式會發生一個問題, 當我Compiler時, 程式都會告知我
Cannot convert 'void(__fastcall*)()'to'void(__fastcall*(_closure)())() 2.我在主程式中加入了兩個按鈕,內容分別只有Test(false)及T3->Terminate()
若我不使用Synchronize則可以Compiler, 但執行兩個按鈕之後都攔截不到
Terminated, 而且run多次之後會當機!! 麻煩各位大大多多指教, 指正我程式中的錯誤, 謝謝大家!!
|
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
aredfish 你好:
試試看底下這樣寫可不可以??
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
aredfish
一般會員 ![]() ![]() 發表:47 回覆:41 積分:17 註冊:2002-12-04 發送簡訊給我 |
|
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
|
aredfish
一般會員 ![]() ![]() 發表:47 回覆:41 積分:17 註冊:2002-12-04 發送簡訊給我 |
謝謝版主大大, 這樣真的就可以執行了, 只要在.h檔中加入新函數的宣告就可以解決了。
我想再請教另一個問題,我要如何設計兩個按鈕, 其中一個是執行MultiThread
另外一個是停止MultiThread,而執行的那一個按鈕在完成一個工作後, 可再接受另一個工作, 我的困難是: 1. 若我在其中一個按鈕內寫入Test *T3=new Test(false), 那麼程式會開始執
行,但是卻停不下來, 因為若我在另一個按鈕中寫入T3->Terminate(), 那麼
對另一個按鈕來說T3就是一個新的變數,所以我得重新宣告, 但這麼一來, 兩
個按鈕之間就失去相互關係了。 2. 若我將Test *T3=new Test(false)放在程式一開始的地方(設為整體變數),
那麼我可以用T3->Resume(), 來啟動MultiThread, 並可用Terminate或
Suspend來停止或暫停MultiThread, 但問題是, 在MultiThread工作完成後
我便無法再利用剛剛裡面寫T3->Resume(), 的按鈕來再次啟動MultiThread 所以挺兩難的(還是我根本就搞錯方向了 ||>_<||) , 麻煩請各位大大再拔刀相助, 謝謝大家!!
|
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我想再請教另一個問題,我要如何設計兩個按鈕, 其中一個是執行MultiThread 另外一個是停止MultiThread,而執行的那一個按鈕在完成一個工作後, 可再接受另一個工作, 我的困難是: 1. 若我在其中一個按鈕內寫入Test *T3=new Test(false), 那麼程式會開始執 行,但是卻停不下來, 因為若我在另一個按鈕中寫入T3->Terminate(), 那麼 對另一個按鈕來說T3就是一個新的變數,所以我得重新宣告, 但這麼一來, 兩 個按鈕之間就失去相互關係了。 2. 若我將Test *T3=new Test(false)放在程式一開始的地方(設為整體變數), 那麼我可以用T3->Resume(), 來啟動MultiThread, 並可用Terminate或 Suspend來停止或暫停MultiThread, 但問題是, 在MultiThread工作完成後 我便無法再利用剛剛裡面寫T3->Resume(), 的按鈕來再次啟動MultiThread 所以挺兩難的(還是我根本就搞錯方向了 ||>_<||) , 麻煩請各位大大再拔刀相助, 謝謝大家!!aredfish 你好: 我~~有點聽不太懂你的意思??< > 也沒有採用類似的方法做過~~< > 不過~~我在想喔~~如果用一個 Test 的 pointer array 應該能夠達成你的目的吧!! Test *T3[MAX_COUNT]; // 其中 MAX_COUNT 需要 define 但是~~如果要這樣做的話 那就要在程式碼中很小心的處理這個 array 了
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
aredfish
一般會員 ![]() ![]() 發表:47 回覆:41 積分:17 註冊:2002-12-04 發送簡訊給我 |
我描述的不太好, 有點亂, 我舉個例子好了
假設我做一個從65535遞減到零的迴圈, 而這個迴圈是寫在MultiThread裡面(註一), 而我的Form上面有一個按鈕,一按下去他就會開始遞減(註二), 然後有另外一個按鈕當我按下去的時候不管他有沒有減到零(註三), 都會終止, 而若我再按
那個開始遞減的按鈕, 則他又會從65535開始重新遞減。 流程大概是這樣, 非常謝謝大家。 註一: 因為如果不寫在Thread裡面, 則程式在他減到零之前都不會動。
註二: 當他遞減的時候i--,也會把i的值show在Form上面,所以要用Synchronize
註三: 也就是說不管他是不是已經結束thread(計算完了); 目的是要讓使用者
可以隨時放棄正在進行中的動作。
|
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 我描述的不太好, 有點亂, 我舉個例子好了 假設我做一個從65535遞減到零的迴圈, 而這個迴圈是寫在MultiThread裡面(註一), 而我的Form上面有一個按鈕,一按下去他就會開始遞減(註二), 然後有另外一個按鈕當我按下去的時候不管他有沒有減到零(註三), 都會終止, 而若我再按 那個開始遞減的按鈕, 則他又會從65535開始重新遞減。 流程大概是這樣, 非常謝謝大家。 註一: 因為如果不寫在Thread裡面, 則程式在他減到零之前都不會動。 註二: 當他遞減的時候i--,也會把i的值show在Form上面,所以要用Synchronize 註三: 也就是說不管他是不是已經結束thread(計算完了); 目的是要讓使用者 可以隨時放棄正在進行中的動作。aredfish 你好: 看來我最近真是太不「善解人意」了
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
aredfish
一般會員 ![]() ![]() 發表:47 回覆:41 積分:17 註冊:2002-12-04 發送簡訊給我 |
|
RaynorPao
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 啊!! 我懂了, 您建議以 "中斷" 的方式來處理, 非常謝謝!! 但請問一下中斷與多執行緒的適用時機大致上在哪裡?? 另外, 我看書上在使用Thread的Synchronize時, 好像都看不到有函數傳入傳出的行為, 譬如,傳入i到input函數,Synchronize(input(i)), 所以我有一個似是而非的觀念就是,如果我要在Thread中讀取或輸入VCL的值, 那麼我就要用整體變數, 這樣對嗎?? 謝謝您!!aredfish 你好: 以下內容轉貼自 BCB help
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
aredfish
一般會員 ![]() ![]() 發表:47 回覆:41 積分:17 註冊:2002-12-04 發送簡訊給我 |
|
wolf_yalow
一般會員 ![]() ![]() 發表:0 回覆:1 積分:0 註冊:2003-08-26 發送簡訊給我 |
版主大大您好~
剛剛看了板主回覆的那個方法,也就是不用執行緒的方法~
但小弟心中還是有疑問,如果採用 aredfish 所提出用執行緒的做法,
那為何再一次 "T3->Resume(), 的按鈕來再次啟動MultiThread"
會不成功呢? 是因為 Thread 執行完畢自己 delete 所以無法再 RUN 了嗎? Thread 執行完畢會自己 delete 是因為 FreeOnTerminate=true;
那如果不給 FreeOnTerminate=true 的話 Thread 會怎樣呢? 小弟想搞懂 BCB Thread 但是一直找不到詳細介紹, VC 的寫法又不一樣~ 很傷腦筋. 小弟只能爬文搜尋到有關 Thread 片段的文章..自己深深的閱覽不足.
可否請各位大大提供一些方向~ 感激不盡~< >< >
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |