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

關於thread的使用

答題得分者是:taishyang
wei0510
一般會員


發表:9
回覆:2
積分:2
註冊:2009-05-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-01 12:24:12 IP:203.67.xxx.xxx 訂閱
我在討論區上讀了幾篇介紹多執行緒的文章,但實際使用上還是無法成功,想向各位先進們請教一下:

我建立了一個form,上面放了一個Button及ProgressBar,當點選Button後先將Button給Disable,接著建立一個執行緒以0.5秒的速度讓ProgressBar的Position增加,並且於Form的部份執行外部程式,當執行的外部程式結束後,關閉跑ProgressBar的執行緒,並且將Position以0.1秒的速度跑至100%。

下面是我的程式片段

Thread.cpp:

[code cpp]
void __fastcall TMyThread::Execute()
{
SetName();
//---- Place thread code here ----
Synchronize(ProgressBarAdd); //因為ProgressBar1是VCL元件所以透過Synchronize執行
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::ProgressBarAdd()
{
while(1)
{
//每0.5秒ProgressBar1加1%:
Sleep(500) ;
Form1->ProgressBar1->Position = (Form1->ProgressBar1->Position 1) ;
}
}
[/code]

main.cpp:


[code cpp]
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MyThread = new TMyThread(true) ; //建立一個新的執行緒並預設暫停。
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//重置ProgressBar1:
ProgressBar1->Max = 100 ;
ProgressBar1->Min = 0 ;
ProgressBar1->Position = 0 ;

Button1->Enable->false; //關閉按鈕
MyThread->Resume() ; //開始跑執行緒
RunEXE() ; // 呼叫外部程式
MyThread->Suspend(); //關閉執行緒

//用0.1秒的速度把ProgressBar1跑至100%:
int i ;
for( i = ProgressBar1->Position ; i <= 100 ; i = i 1)
{
Sleep(100) ;
ProgressBar1->Position = i ;
}
Button1->Enable->true; //關閉按鈕
}

[/code]

我所遇到問題有兩個:
1.按下按鈕後,新增的執行緒並沒有執行。
2.當動作完成後(Button1->Enable = true後),整個程式會變成當機的狀態,但如果把
MyThread->Resume() ; //開始跑執行緒
MyThread->Suspend(); //關閉執行緒
兩行註解掉,就沒事了。

我想兩個問題都出在執行緒的操作上,但我還是找不出原因,請問有使用過多執行緒的先進們是不是能給我一些建議呢?
wei0510
一般會員


發表:9
回覆:2
積分:2
註冊:2009-05-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-06-01 13:53:29 IP:203.67.xxx.xxx 訂閱
我發現執行完程式會當掉的原因了:

不知道為什麼新增的執行緒會在離開

void __fastcall TForm1::Button1Click(TObject *Sender)

後才會執行,然而離開後並沒有任何能脫離執行緒的程式碼,所以會變成在執行緒中跑無窮回圈。

這點跟我預期的有點不同,照理說應該是在

MyThread->Resume() ;

這段就要開始跑執行緒了,而在

MyThread->Suspend();

就該停止執行緒了,為什麼會等到離開Button1Click才開始跑呢?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-06-01 15:56:00 IP:118.169.xxx.xxx 訂閱
先參考一下可以WORK的範例
http://delphi.ktop.com.tw/board.php?cid=169&fid=936&tid=18760
心得分享:多執行緒測試

你的用法似乎是有問題的
系統時間:2024-04-25 22:40:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!