Thread呼叫問題 |
尚未結案
|
theee
一般會員 發表:5 回覆:5 積分:2 註冊:2007-05-25 發送簡訊給我 |
大家好我有一個問題
我利用BCB create出一個Form的Project [code cpp] class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); void Test(); };[/code] 另外我在.cpp檔中宣告了一個thread [code cpp] class TMyThread:public TThread { public: __fastcall TMyThread(TForm1 *Form1); TForm1 *Form1; private: void __fastcall Execute(); }; [/code] 如今我想要做的事情是讓Thread的Execute可以執行到Form中的Test()這函式 因此我在Thread的constructor中 [code cpp] _fastcall TMyThread::TMyThread(TForm1 *Form1):TThread(true) { this->Form1 = Form1; } [/code] 將Form1物件給了Thread物件,然後我在 [code cpp] void __fastcall TMyThread::Execute( ) { this->Form1->Test(); } {[/code] 但我執行的時候,錯誤訊息為 [code cpp] [C Error] Unit1.cpp(55): E2356 Type mismatch in redeclaration of 'TForm1::Test()' [C Error] Unit1.h(20): E2344 Earlier declaration of 'TForm1::Test()' [C Warning] Unit1.cpp(56): W8019 Code has no effect [/code] 請問我哪邊錯誤了呢 或者要怎麼改寫呢? 因為我程式本來的思維是 我主程式流程是 A -> B ->C這樣順序執行 在B階段的時候我會new一個thread一直去執行,而此時主程式會去wait這thread結束後才繼續執行C 但thread要執行的函式是包在Form這個scope內,所以我才想到這樣改寫,但出現這樣的錯誤,多謝各位的幫忙 編輯記錄
theee 重新編輯於 2008-03-11 18:13:00, 註解 無‧
|
daldal
高階會員 發表:6 回覆:102 積分:226 註冊:2007-06-18 發送簡訊給我 |
class 類別宣告擺在unit1.h
[code cpp] class TMyThread : public TThread { public: __fastcall TMyThread(void); private: void __fastcall Execute(void); void __fastcall DoSomething(void); }; [/code] .cpp部分 [code cpp] __fastcall TMyThread::TMyThread(void):TThread(true) { Resume(); } //------------------------------------------------------- void __fastcall TMyThread::Execute(void) { FreeOnTerminate=true; while (!Terminated) { // Methods and properties of objects in VCL can only be // used in a method called using Synchronize() Synchronize(DoSomething); // 要改變 VCL 物件內容必須透過 Synchronize 呼叫 } } //------------------------------------------------------- void __fastcall TMyThread::DoSomething(void) { Form1->xxxxxxxxxxxx; } [/code] 在DoSomething(void) 函式內就可以直接使用Form1->xxxxx function (前提是你的function得宣告在Form1的public) |
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
|
hipig
高階會員 發表:31 回覆:75 積分:111 註冊:2007-01-15 發送簡訊給我 |
每開一個線程(利用新增的方式)
都會特別在程式碼內叮嚀 // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // Synchronize(UpdateCaption); // where UpdateCaption could look like: // void __fastcall TTEST::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // }
編輯記錄
hipig 重新編輯於 2008-03-12 10:38:38, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |