2009-11-25 56 views
0

是否可以優先使用PostMessage(或任何其他相關方法)發送的消息?PostMessage優先?

例如,只有在隊列中沒有其他消息時,纔會處理IIRC,WM_PAINT消息。是否有可能實現與自定義消息類似的行爲?

如果我使用具有特殊參數的WM_PAINT爲了向窗口(我控制WndProc)提供自定義消息,它會有類似的行爲嗎?

回答

1

對於WM_PAINTDefWndProc中的窗口代碼只是設置一個標誌,然後只在隊列爲空時檢查該標誌,下一次調用GetMessage。一些鼠標消息也會合並(舊的消息在新消息到達時被刪除)。

真正的答案取決於你實際想要達到的行爲。

如果你正試圖避免重入只檢查一個標誌爲快的出口 ,是這樣的:

////bool processing = false; // class/window instance variable 
... 
void HandleCustomMessage() 
{ 
    ////if (processing) 
    ////{ 
    //// return; 
    ////} 

    ////processing = true; 
    DoSomething(); 
    ////processing = false; 
} 

如果你想要一個實際的優先級隊列,有無數的PQ實現。將數據項添加到PQ,然後發佈自定義消息(始終是相同的ID)。自定義消息處理程序然後向PQ詢問最高優先級的項目。


另一種選擇是攔截 GetMessage循環,使用 PeekMessage一個電話,看看是否有什麼做的,然後調用 GetMessage如果消息是可用的,或以其他方式檢查您的PQ。這種方法不需要自定義消息。

+0

不知道我理解的標誌方法。用戶界面隊列是單線程的,所以你永遠不會遇到這種情況(或者如果你指的是避免多個隊列的重入,我不認爲它與優先級有關)。使用自定義消息+單獨的PQ是一個好主意,儘管優先級不會與其他「非定製」消息一起使用。我想知道有沒有一些內部機制? – sold 2009-11-25 16:51:26

+0

哎呀,一半睡着了,忘記了單個用戶界面線程 - 驚人的是,當你沒有每天處理這些東西時,你忘記了多快。 – devstuff 2009-11-26 02:03:37

2

我想要一個後臺線程來通知主要的那個結果可以顯示給用戶。但是,如果您只是將消息發佈到主線程,它將立即得到處理。

這導致應用程序不響應繪畫或用戶輸入消息,因爲我發佈的消息總是優先。

我使用的技巧是知道WM_TIMER消息的優先級低於WM_PAINT消息。

因此,而不是發佈消息到主窗體,我會設置一個計時器。

定時器信息的優先級低於

    其他
  • 發佈的消息
  • WM_PAINT消息