全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1401
推到 Plurk!
推到 Facebook!

請問Form之間的傳訊問題(嚴重的delay)

尚未結案
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-30 04:48:44 IP:211.74.xxx.xxx 未訂閱
各位高手好,小弟最近利用包子哥所說的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-30 09:25:17 IP:203.73.xxx.xxx 未訂閱
引言: 各位高手好,小弟最近利用包子哥所說的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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-30 09:55:23 IP:211.75.xxx.xxx 未訂閱
好複雜的寫法喔! 告訴你一個簡單的方式 利用FileMapping來儲存兩者的HWND 還有迴圈執行時間過久而導致程式類似鎖死的狀態的問題,一個是在迴圈中加入Applcation->ProcessMessage(),另一個是在Thread中去處理
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-30 14:09:44 IP:211.74.xxx.xxx 未訂閱
請問jcjroc兄,有關於FileMapping的方式,之前站上有人Po過一次,但因為寫得有點簡略,我看不太懂他的寫法,可否說個範例讓我了解一下,謝謝包子哥與jcjroc兄的回應,小弟會再去試一下,但包子哥講的部份,我有在找檔案個數中有寫個Application->ProcessMessage(),但好像沒什用,以前我用Socket傳的時後,不會有這個狀況產生,這是問題出在那??迴圈也只有在找檔案列表的時後有出現,其它都是找FindWindow的方式篆寫.
pental
初階會員


發表:3
回覆:48
積分:30
註冊:2003-09-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-05 09:09:06 IP:211.21.xxx.xxx 未訂閱
我覺得你是不是可以用 RegisterMessage 的方式,讓 A 和 B 兩個程式透過改寫WinProc 處理你註冊過的 Message ,會比較簡單一點!你就可以不需要去 FindWindow 了!
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-05 15:53:29 IP:203.70.xxx.xxx 未訂閱
想請問這位大哥,使用RegisterMessage的方式大概怎麼做?? 有相關的文獻可以參考,或範例可以參考
pental
初階會員


發表:3
回覆:48
積分:30
註冊:2003-09-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-06 14:32:03 IP:211.21.xxx.xxx 未訂閱
以下是一個簡單的範例,在這個範例裡面 程式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); //訊息廣播 } //--------------------------------------------------------------
系統時間:2024-05-04 7:57:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!