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

Thread呼叫問題

尚未結案
theee
一般會員


發表:5
回覆:5
積分:2
註冊:2007-05-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-11 18:12:05 IP:122.146.xxx.xxx 未訂閱
大家好我有一個問題
我利用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-11 19:36:31 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-12 09:11:59 IP:203.73.xxx.xxx 訂閱
你的想法很正常,在THREAD呼叫一個FUNCTION來處理FORM的資料
但是作法卻是錯的,你的作法會導致不可預期的錯誤,或許你現在不會發生,但是相信我一定會發生,且發生時你會不知如何DEBUG

請先用 Thread 搜尋一下,爬爬文後再來寫程式
hipig
高階會員


發表:31
回覆:75
積分:111
註冊:2007-01-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-12 10:38:04 IP:140.126.xxx.xxx 未訂閱
每開一個線程(利用新增的方式)
都會特別在程式碼內叮嚀
// 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, 註解 無‧
系統時間:2024-04-24 1:00:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!