請問Form之間的傳訊問題(嚴重的delay) |
尚未結案
|
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
各位高手好,小弟最近利用包子哥所說的Form間傳訊的方法實作,但會發生,訊息雖然很正常的傳遞,但執行效率會變得很慢,不知道為何會這樣,我把程式大致上解說如下
有兩個程式A與B,A呼叫B執行之後,B在CreateForm事件下傳Ack回A回報B已經執行完成,然後A再用FindWindows方式找B,然後傳訊息給B,B利用A所傳的訊息執行相關執行(例如,尋找子目錄下的檔案個數),執行結果再利用Findwindow與SendMessage的方式傳回A. 但小弟遇到的情形是
1.B在被呼叫之後,就整個好像程式死當一樣,要等執行工作完成(執行尋找子目錄檔案個數之後)才會出現B的Form,同時,我有把找到的檔案,Show在B的Memo1下,卻也是得等執行B所給予的動作之後,才能知道檔案列表,這樣的方式可以解決嗎??基本上程式執行沒有問題,但問題就是執行效率的問題,如果使用Applcation->ProcessMessage()那應該要使用在哪個程式(A或B)比較洽當??
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 各位高手好,小弟最近利用包子哥所說的Form間傳訊的方法實作,但會發生,訊息雖然很正常的傳遞,但執行效率會變得很慢,不知道為何會這樣,我把程式大致上解說如下 有兩個程式A與B,A呼叫B執行之後,B在CreateForm事件下傳Ack回A回報B已經執行完成,然後A再用FindWindows方式找B,然後傳訊息給B,B利用A所傳的訊息執行相關執行(例如,尋找子目錄下的檔案個數),執行結果再利用Findwindow與SendMessage的方式傳回A. 但小弟遇到的情形是 1.B在被呼叫之後,就整個好像程式死當一樣,要等執行工作完成(執行尋找子目錄檔案個數之後)才會出現B的Form,同時,我有把找到的檔案,Show在B的Memo1下,卻也是得等執行B所給予的動作之後,才能知道檔案列表,這樣的方式可以解決嗎??基本上程式執行沒有問題,但問題就是執行效率的問題,如果使用Applcation->ProcessMessage()那應該要使用在哪個程式(A或B)比較洽當??willchen 你好: 小弟我想基本上,目前 B 會發生一段時間無回應的現象,因此試著在 B 處理 程序的過程裡面 (尤其是迴圈) 加入 Application->ProcessMessages(); 看看 情況會不會好一點?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
jcjroc
高階會員 發表:21 回覆:279 積分:115 註冊:2002-09-18 發送簡訊給我 |
|
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
|
pental
初階會員 發表:3 回覆:48 積分:30 註冊:2003-09-21 發送簡訊給我 |
|
willchen
初階會員 發表:64 回覆:81 積分:29 註冊:2003-05-23 發送簡訊給我 |
|
pental
初階會員 發表:3 回覆:48 積分:30 註冊:2003-09-21 發送簡訊給我 |
以下是一個簡單的範例,在這個範例裡面 程式B按下分別 Login、Offlien、Logout的三個按鈕,程式A在 WinProc 的函式裡面若發現有收到相對應的訊息,就會ShowMessage,我在SendMessage的地方是使用 HWND_BROADCAST 訊息廣播的方式,這樣可以一次讓多個程式都收到這個訊息。供你做個參考! // 程式 A
宣告檔的部分↓
class TFormA : public TForm
{
private:
unsigned int WM_OnLine;
unsigned int WM_Offline;
unsigned int WM_Logout; protected: void __fastcall WndProc(Messages::TMessage &Message); public: // User declarations
__fastcall TFormA(TComponent* Owner);
}; 程式碼的部分↓
__fastcall TFormA::TFormA(TComponent* Owner)
: TForm(Owner)
{
WM_OnLine = RegisterWindowMessage("WM_OnLine"); //註冊訊息
WM_Offline = RegisterWindowMessage("WM_Offline");
WM_Logout = RegisterWindowMessage("WM_Logout");
}
//----------------------------------------------------------
void __fastcall TFormA::WndProc(Messages::TMessage &Message)
{
if(Message.Msg == WM_Offline) //判斷是否收到自訂的訊息
{
ShowMessage("Offline");
}
else if(Message.Msg == WM_OnLine)
{
ShowMessage("OnLine");
}
else if(Message.Msg == WM_Logout)
{
ShowMessage("Logout");
}
else
{
TWinControl::WndProc(Message);
}
}
//---------------------------------------------------------------- // 程式 b
宣告檔的部分↓
class TFormB : public TForm
{
__published: // IDE-managed Components
TButton *btnLogin;
TButton *btnOffline;
TButton *btnLogout;
void __fastcall btnLoginClick(TObject *Sender);
void __fastcall btnOfflineClick(TObject *Sender);
void __fastcall btnLogoutClick(TObject *Sender);
private:
unsigned int WM_OnLine;
unsigned int WM_Offline;
unsigned int WM_Logout; protected: public: // User declarations
__fastcall TFormB(TComponent* Owner);
}; 程式碼的部分↓
__fastcall TFormB::TFormB(TComponent* Owner)
: TForm(Owner)
{
WM_OnLine = RegisterWindowMessage("WM_OnLine"); //註冊訊息
WM_Offline = RegisterWindowMessage("WM_Offline");
WM_Logout = RegisterWindowMessage("WM_Logout");
}
//----------------------------------------------------------
void __fastcall TFormB::btnLoginClick(TObject *Sender)
{
SendMessage(HWND_BROADCAST,WM_OnLine,0,0); //訊息廣播
}
//---------------------------------------------------------------
void __fastcall TFormB::btnOfflineClick(TObject *Sender)
{
SendMessage(HWND_BROADCAST,WM_Offline,0,0); //訊息廣播
}
//---------------------------------------------------------------
void __fastcall TFormB::btnLogoutClick(TObject *Sender)
{
SendMessage(HWND_BROADCAST,WM_Logout,0,0); //訊息廣播
}
//--------------------------------------------------------------
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |