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

Thread 使用

尚未結案
parais
一般會員


發表:15
回覆:11
積分:5
註冊:2002-08-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-19 17:16:16 IP:211.21.xxx.xxx 未訂閱
看了各位先進在此站的一些有關多執行緒文章大作後,仍有許多問題: 可否有空幫我解惑一下 原本無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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-19 17:33:45 IP:61.30.xxx.xxx 未訂閱
我以前是用這種笨方法寫的,不知道您指的是不是這個意思 void __fastcall MyThread::Execute(void) { Priority = tpTimeCritical; if(!Terminated) Run(Select); }
parais
一般會員


發表:15
回覆:11
積分:5
註冊:2002-08-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-19 18:08:40 IP:211.21.xxx.xxx 未訂閱
我有點不明白那個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-20 20:23:49 IP:211.76.xxx.xxx 未訂閱
建議把變數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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-22 20:24:01 IP:211.21.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-22 21:37:58 IP:211.76.xxx.xxx 未訂閱
先說那個變數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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-24 12:09:45 IP:61.70.xxx.xxx 未訂閱
感謝artist1002的熱心解答,再次謝謝你 謝謝您花費寶貴時間回應!!
------
**********************


**********************
parais
一般會員


發表:15
回覆:11
積分:5
註冊:2002-08-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-24 12:10:05 IP:61.70.xxx.xxx 未訂閱
感謝artist1002的熱心解答,再次謝謝你 謝謝您花費寶貴時間回應!!
------
**********************


**********************
septem
一般會員


發表:2
回覆:2
積分:0
註冊:2003-08-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-11 15:48:14 IP:61.229.xxx.xxx 未訂閱
引言: 我有點不明白那個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,,那要怎麼辦?? 謝謝您花費寶貴時間 ********************** **********************
以上之程式我不太清楚,可否能在說清楚一些。謝謝
系統時間:2024-05-02 13:46:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!