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

請問在自訂訊息處理程式裡 PostMessage 同一個自訂訊息為什麼會造成視窗無法回應

尚未結案
martindc301
一般會員


發表:1
回覆:3
積分:0
註冊:2009-07-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-02 10:01:20 IP:59.120.xxx.xxx 訂閱
我想利用自訂訊息的方式造成一個迴圈以處理資料的接收工作,
依照我的想法,
PostMessage 可以把訊息放入 Message Queue 中而不需等它執行完畢,
自訂訊息和視窗訊息應該有同等被執行的機會,
但是程式一執行後視窗就完全無法回應了,
不知問題出在哪?

以下是概略的程式碼:
//---------------------------------------------------------------------------
// .H
//---------------------------------------------------------------------------
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_TEST, TMessage, MyTest)
END_MESSAGE_MAP(TForm)

//---------------------------------------------------------------------------
// .cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::MyTest(TMessage &Message)
{
// 處理資料接收工作

if(m_TestRun)
PostMessage(Handle, CM_TEST, 0, 0);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
m_TestRun = !m_TestRun;
if(m_TestRun)
{
Button1->Caption = "Stop";
PostMessage(Handle, CM_TEST, 0, 0);
}
else
Button1->Caption = "Run";
}
//---------------------------------------------------------------------------

編輯記錄
martindc301 重新編輯於 2009-07-02 10:02:31, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-02 20:30:33 IP:118.169.xxx.xxx 訂閱
因為CPU資源都被你的迴圈吃掉了CPU 100%
可以加上
Application->ProcessMessages();

// 處理資料接收工作
if(m_TestRun){
//cnt ;
Application->ProcessMessages();
PostMessage(Handle, CM_TEST, 0, 0);
}

但應該要用thread來接收資料比較好吧?
martindc301
一般會員


發表:1
回覆:3
積分:0
註冊:2009-07-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-02 22:52:40 IP:59.115.xxx.xxx 訂閱
因為我的觀念還不是很清楚,
所以再澄清一下...

訊息的處理程序是在 Application->Run() 中,
PeekMessage 後由 TApplication::OnMessage 到 TApplication::ProcessMessage(),
然後 StdWndProc -> WndProc -> Dispatch,
流程之中也有執行 TApplication::ProcessMessage(),
為何額外加入的 ProcessMessage() 才可以避免視窗無回應,
而原流程中的 ProcessMessage() 卻不行呢?

不建另一 Thread 只是想偷懶,
因為程式不大,
若自訂訊息的迴圈方式可行的話,
我就可以省掉很多 Multi-Thread 的同步考量.
編輯記錄
martindc301 重新編輯於 2009-07-02 22:57:52, 註解 無‧
frontier
初階會員


發表:0
回覆:27
積分:30
註冊:2008-11-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-03 08:34:52 IP:59.125.xxx.xxx 訂閱
訊息流程是一個「流程」,表示是「成串傳遞」的
可能是因為
你自己使用一個自己的函式取代其中一個,沒有將訊息往下傳,
如果沒有,當然是斷掉了,這樣視窗,沒有反應,應該很正常吧

===================引 用 martindc301 文 章===================
因為我的觀念還不是很清楚,
所以再澄清一下...

訊息的處理程序是在 Application->Run() 中,
PeekMessage 後由 TApplication::OnMessage 到 TApplication::ProcessMessage(),
然後 StdWndProc -> WndProc -> Dispatch,
流程之中也有執行 TApplication::ProcessMessage(),
為何額外加入的 ProcessMessage() 才可以避免視窗無回應,
而原流程中的 ProcessMessage() 卻不行呢?

不建另一 Thread 只是想偷懶,
因為程式不大,
若自訂訊息的迴圈方式可行的話,
我就可以省掉很多 Multi-Thread 的同步考量.
martindc301
一般會員


發表:1
回覆:3
積分:0
註冊:2009-07-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-03 09:27:24 IP:59.120.xxx.xxx 訂閱
我是利用 MESSAGE_MAP 的方式處理自訂訊息,
那應該是 Dispatch 那層,
而其他的訊息我也沒去攔,
應該不會有"斷掉了"的問題才對...

===================引 用 frontier 文 章===================
訊息流程是一個「流程」,表示是「成串傳遞」的
可能是因為
你自己使用一個自己的函式取代其中一個,沒有將訊息往下傳,
如果沒有,當然是斷掉了,這樣視窗,沒有反應,應該很正常吧
系統時間:2017-10-20 2:21:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!