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

用BCB寫的最簡單的一個多執行緒小程式

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-06-17 15:24:27 IP:61.220.xxx.xxx 未訂閱
用BCB寫的最簡單的一個多執行緒小程式 ======================================================== //.cpp中的執行緒描述 _fastcall TMyThread::TMyThread(void):TThread(true) { FreeOnTerminate=true; Resume(); }    //執行緒宣告   void __fastcall TMyThread::Execute()//執行緒 function { for(int i=1;i<4;i ) Form1->Memo1->Text=Form1->Memo1->Text IntToStr(i) "我得到了變數--我的執行緒\r\n"; } void __fastcall TForm1::Button2Click(TObject *Sender)//執行執行緒 { MyThread=new TMyThread(); MyThread->FreeOnTerminate=true; } //.h中的執行緒類別定義 //宣告執行緒類別 class TMyThread:public TThread { public: __fastcall TMyThread(void); private: void __fastcall Execute(void); }; //可以在.h的視窗類別定義中加入 TMyThread *MyThread; //宣告一個新的執行緒
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-12 09:44:48 IP:61.218.xxx.xxx 未訂閱
Thread Basics    參考網頁: http://www.temporaldoorway.com/programming/cbuilder/threads/basics.htm    TThread    In C++ Builder, threads are created as instances of a class derived from TThread. The following shows the basic elements of a TThread derived class, and the member functions you need to override. Note that a thread can have any desired internal data or additional functions. Also note that this thread class inlines the member functions, but that is not required.      class SampleThread: public TThread    {       private:             void __fastcall Execute(void) // This is what gets run when the thread starts          {             while (!Terminated)              {                 // Wait for an event or perform processing                    if (!Terminated)// This is optional but normal                 {                    Synchronize(UpdateTheMainThreadDataOrControls);                 };              };          };          public:             __fastcall SampleThread(StartupData Whatever /* You can provide any data the thread needs to run properly */): TThread(TRUE) // Start the thread suspended          {             // Use the StartupData to initialize class instance data here                FreeOnTerminate = true;             Resume(); // Thread now runs          };             __fastcall ~SampleThread(void)          {             // Cleanup, deallocate, etc.          };             void __fastcall Terminate(void)// This is what you call to terminate the thread; use Suspend to pause it          {             TThread::Terminate();             // If the main loop is waiting on an event, set the event here          };    };    時間就是金錢
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-19 20:12:04 IP:61.228.xxx.xxx 未訂閱
我剛好在學如何寫Thread的程式,穫益良多,謝謝 不過這一行 ==>TMyThread *MyThread; //宣告一個新的執行緒 應該要是要加在.cpp的檔案中
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-20 08:52:42 IP:61.218.xxx.xxx 未訂閱
引言: 我剛好在學如何寫Thread的程式,穫益良多,謝謝 不過這一行 ==>TMyThread *MyThread; //宣告一個新的執行緒 應該要是要加在.cpp的檔案中
其實這個宣告放在哪都無所謂,如果TMyThread *MyThread;宣告在MyThread.H中, 而在MyThread.cpp中Include MyThread.H,其實宣告的方法是相同的! 只要讓MyThread.cpp中的自訂函式能看見 MyThread這個物件就可以了! <>寫程式沒有絕對的標準法則,完全是程式員的心靈構思 ! <>網<>路志<>工聯盟---- href="http://www.vista.org.tw">http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
kkid
一般會員


發表:1
回覆:5
積分:1
註冊:2002-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-20 09:16:29 IP:61.219.xxx.xxx 未訂閱
請問Synchronize(function name) 即是代表整個function都是Synchronize的嗎? 一次只有一個thread可以run那個function? 謝謝...^_^
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-21 12:41:33 IP:211.75.xxx.xxx 未訂閱
[/quote] 其實這個宣告放在哪都無所謂,如果TMyThread *MyThread;宣告在MyThread.H中, 而在MyThread.cpp中Include MyThread.H,其實宣告的方法是相同的!    只要讓MyThread.cpp中的自訂函式能看見 MyThread這個物件就可以了! 謝謝指導 這讓我對
tender
初階會員


發表:23
回覆:90
積分:37
註冊:2002-09-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-09-30 18:51:02 IP:211.74.xxx.xxx 未訂閱
放在哪裡是有差別的 若放在
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-10-06 12:31:22 IP:203.204.xxx.xxx 未訂閱
對於 TThread 小弟真的是不太了解,看了您的範例發現只有    MyThread=new TMyThread();    卻沒有    delete MyThread;    請問,TThread 都是不用 delete 的嗎? 之前看同事的 Code 也是覺得為什麼只有 new 沒有 delete 呢? 而我多事加上 delete 卻又發生 Exception!!    沒空更新的網頁...
C及指標教學 http://coolsite.to/dllee介紹Shells http://coolsite.to/ushells
------
http://www.ViewMove.com
China Join
中階會員


發表:81
回覆:242
積分:89
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-10 22:18:38 IP:61.216.xxx.xxx 未訂閱
dllee 版主您好,因為有下了 FreeOnTerminate=true; 這個指令所以當執行緒 結束的時候,會自動從記憶體移除,但是下面兩個地方(紅色字)只要保留一個就可以了,小弟建議保留在執行緒裡面。    呵,小弟只是新手,若有錯誤,請各位大大多包涵  //.>> >>>>>>> } //.
andrewking
一般會員


發表:3
回覆:12
積分:3
註冊:2005-10-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2006-07-22 12:43:40 IP:59.125.xxx.xxx 未訂閱

非常感謝各位大大的文章~~今天我終於會使用TThread了~~好高興喔~~

我會加油的!! 再次謝謝!!

CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2006-08-12 00:30:53 IP:140.125.xxx.xxx 未訂閱

可以再加上

void __fastcall TMyThread::Execute()

{

while(!Terminated)

{

//要做的事

}

}

MyThread->Terminate();

因為BCB中的Terminate()只是將

MyThread->Terminated = true;

這樣就能使用
------
=.=???
kenlee1109
初階會員


發表:20
回覆:40
積分:27
註冊:2006-08-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2006-08-24 22:12:14 IP:61.229.xxx.xxx 未訂閱

TThread 程式裏不能有圖形的指令,如 Label1->Caption = "xxx" 這樣的句子也不行,這是我的經驗,

所以只有將訊息寫入變數中,再用 Timer 於定時將 Thread 中的變數寫出,哈!

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2006-08-25 03:04:14 IP:61.229.xxx.xxx 未訂閱

報歉,我還是雞婆一下…修正一下你的說法。希望會有一些更好的幫助!

Thread正確講是可以有Label1之類的vcl(Canvas 類的除外)的指令,只是要透過Synchronize( ) 間接的幫你完成。比如說:

void __fastcall TMyThread::PushTheButton(void) //自己定的fucntion

{
Label1->Caption = "xxx"
}

void __fastcall TMyThread::Execute()
{
...
Synchronize(PushTheButton); //間接幫你完成
...
}

若是要把thread內的變數(非vcl) 值設回主程式(主thread),則要考慮用TCriticalSection來幫忙(請參考help檔)。
屬於Canvas 物件類的只需要使用lock的屬性來lock和unlock就可以。

當然你說的的timer的方式也可行,但比較不能精準的在正確的時候就把值(動作)傳回。

參考一下囉,也謝謝你提供你的經驗和方法!

ps. 突然想到一個thread中比較少人提到但很重要的事…就是thread裡面若要用到com元件,一定要先自己下
CoInitialize(0);
最後再下
CoUninitialize();
最常見的例子就是使用ADOConnection... ADOxxxx 等。

===================引 用 文 章===================

TThread 程式裏不能有圖形的指令,如 Label1->Caption = "xxx" 這樣的句子也不行,這是我的經驗,

所以只有將訊息寫入變數中,再用 Timer 於定時將 Thread 中的變數寫出,哈!

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
jling60
一般會員


發表:0
回覆:1
積分:0
註冊:2010-06-07

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-05-31 18:58:07 IP:140.124.xxx.xxx 訂閱
不好意思    我是新手
看完各位高手的解答後
想藉由這篇主題 問一個問題
請問
FreeOnTerminate=false;
在什麼情況下 適合使用
或者 可以怎麼寫簡單的code馬上了解這個變數的用意嗎?
我自己有寫一個Thread小程式 測試
但我修改這個變數為true後
resume()後 再terminate()
再resume() 還是可以運作
沒有甚麼異狀產生
謝謝各位先進
編輯記錄
jling60 重新編輯於 2011-06-01 01:38:19, 註解 無‧
系統時間:2024-11-21 21:49:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!