Thread 使用 |
尚未結案
|
parais
一般會員 發表:15 回覆:11 積分:5 註冊:2002-08-22 發送簡訊給我 |
看了各位先進在此站的一些有關多執行緒文章大作後,仍有許多問題:
可否有空幫我解惑一下
原本無thread..程式會呼叫一function Start(BYTE),若要改用thread執行,是否將Start(BYTE)移至Thread::Execute(void)中,,那原有參數a(local)要如何傳遞呢?? 主程式執行到此,即會啟動thread
Thread = new TMyThread;
while(!Terminated)
{
Synchronize(RunThread);
MainForm->Start(a);
Sleep(1000);
} ********************** **********************
------
********************** ********************** |
turboted
版主 發表:95 回覆:754 積分:452 註冊:2002-07-23 發送簡訊給我 |
|
parais
一般會員 發表:15 回覆:11 積分:5 註冊:2002-08-22 發送簡訊給我 |
我有點不明白那個Select,是指全域變數嗎??
可能我表達不明吧
原程式
void __fastcall TMainForm::TimerPM1Timer(TObject *Sender)
{
.
BYTE a=0;
.
.
Start(a);//加入thread 後,..置換為 MyThread = new TMyThread;
.
.
.
}
加入thread...
void __fastcall TMyThread::Execute(void)
{
FreeOnTerminate=true;
while(!Terminated)
{
MainForm->Start(a);//這個參數a要如何傳入
Synchronize(RunThread);
Sleep(1000);
}
}
另一問是,通常建議vcl messages的傳遞是要放入Synchronize(RunThread),但如果在MainForm->Start(a)中就己經有修改到vcl,,那要怎麼辦?? 謝謝您花費寶貴時間 ********************** **********************
------
********************** ********************** |
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
建議把變數a宣告在privite當中
然後
void __fastcall TMyThread::Execute(void) { FreeOnTerminate=true; while(!Terminated) { //MainForm->Start(a);//這個參數a要如何傳入 改成下面 Synchronize(Start); //加一個函數,記得要先宣告在header當中 Synchronize(RunThread); Sleep(1000); } } //加入下面的函數 void __fastcall TMyThread::Start(void) { MainForm->Start(a); }發表人 - artist1002 於 2003/05/20 20:24:34 |
parais
一般會員 發表:15 回覆:11 積分:5 註冊:2002-08-22 發送簡訊給我 |
sorry,,,太早close這個討論..是否還要再發表一新主題..?? 我試過上述的方式,變數a要宣告在TMainForm class 的public下,才可用
void __fastcall TMyThread::Start(void)
{
MainForm->Start(MainForm->a);//MainForm->Start(a);
}
不然編譯會有錯誤,但是這樣問題仍無法解決;
看了delphiK.top上的很多文章,我對於編寫thread仍然很模糊;
一.thread是經由MyThread = new TMyThread,那是不是會有MyThread1 = new
TMyThread,MyThread2 = new TMyThread...等等出現..還是需要多個TMyThread的
class??
二.thread經由MyThread = new TMyThread而開始執行,然而他的動作是否就類似無窮回
圈,直到MyThread->Terminate();
三.MainForm中執行到這行時:MyThread = new TMyThread,thread啟動,當thread啟動時
,Mainform有一local變數要如何傳入(如同我post在版上的問題一樣);MainForm與
thread同時繼續做下去時(是嗎??),MainForm會改變local a,而thread亦會對a作運算後
,又要如何回傳這個變數給MainForm??? 雖然還有很多問題待釐清,.但不好意思一次問太多..請各位先進幫忙..謝謝 void __fastcall TMainForm::TimerPM1Timer(TObject *Sender)
{
.
BYTE a=0;
.
.
Start(a);//加入thread 後,..置換為 MyThread = new TMyThread;
.
.
a ;//啟動thread後local a會被mainform改變
.
.
}
加入thread...
void __fastcall TMyThread::Execute(void)
{
FreeOnTerminate=true;
while(!Terminated)
{
Synchronize(Start);
Sleep(1000);
}
}
void __fastcall TMyThread::Start(void)
{
MainForm->Start(a);//
} 謝謝您花費寶貴時間回應!! 發表人 - parais 於 2003/05/22 20:28:23
------
********************** ********************** |
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
先說那個變數a好了
你如果是存在MainForm了畫就是共同使用的變數
如果你是要每一個Thread都使用不同的變數就應該宣告在Thread的Class裡面的private或是public
接下來你的問題
一. 如果你要使用多個TMyThread可以使用陣列方式宣告,或是使用迴圈來宣告,宣告完之後使用TThreadList來儲存Thead.再用同一個變數來建立...
for example
TThreadList *ThreadList; ThreadList = new TThreadList(); TMyThread *MyThread; for (int i=0;i<10;i ) { MyThread = new TMyThread(false); ThreadList->Add(MyThread); }二.我的答案是不一定, 看你的Thread怎麼設計 如果你需要一直偵測某些東西或是需要Thread一直持續工作到你喊停 就可以在Thread的Execute()裡面使用無窮迴圈 for example while(!Terminated) { something }你可以使用 Terminate()來結束,或是Suspend()來暫停,Resume()來繼續執行 如果你不使用無窮迴圈 Thread就會執行完Execute()就結束 至於結束之後釋放Thread工作 就要看你的Thread的FreeOnTerminate設定 為true就會結束後自動釋放 為false就要你自己寫code來釋放 三.你可以改寫TMyThread的建構函數 假設要傳入的變數為int a; 你可以在Thread的class裡面加入一個變數,假設叫threadvariant 可以改成 __fastcall TSendMail::TMyThread(bool CreateSuspended,int a) : TThread(CreateSuspended) { threadvariant=a; }然後再Execute()的區段就可以使用這個變數了 至於和MainForm的變數溝通 就要使用Synchroniz()來做 可以寫兩個函數GetMainFormVariant()和SetMainFormVariant()分別是抓取MainForm變數和設定MainForm變數 void __fastcall TMyThread::GetMainFormVariant(void) { threadvariant=MainForm->a; } void __fastcall TMyThread::SetMainFormVariant(void) { MainForm->a=threadvariant; }然後再Execute()裡面就可以對threadvariant作處理 for example... void __fastcall TMyThread::Execute() { Synchroniz(GetMainFormVariant); do something with threadvariant Synchroniz(SetMainFormVariant); }參考看看... |
parais
一般會員 發表:15 回覆:11 積分:5 註冊:2002-08-22 發送簡訊給我 |
|
parais
一般會員 發表:15 回覆:11 積分:5 註冊:2002-08-22 發送簡訊給我 |
|
septem
一般會員 發表:2 回覆:2 積分:0 註冊:2003-08-11 發送簡訊給我 |
引言: 我有點不明白那個Select,是指全域變數嗎?? 可能我表達不明吧 原程式 void __fastcall TMainForm::TimerPM1Timer(TObject *Sender) { . BYTE a=0; . . Start(a);//加入thread 後,..置換為 MyThread = new TMyThread; . . . } 加入thread... void __fastcall TMyThread::Execute(void) { FreeOnTerminate=true; while(!Terminated) { MainForm->Start(a);//這個參數a要如何傳入 Synchronize(RunThread); Sleep(1000); } } 另一問是,通常建議vcl messages的傳遞是要放入Synchronize(RunThread),但如果在MainForm->Start(a)中就己經有修改到vcl,,那要怎麼辦?? 謝謝您花費寶貴時間 ********************** **********************以上之程式我不太清楚,可否能在說清楚一些。謝謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |