是否可以優先使用PostMessage
(或任何其他相關方法)發送的消息?PostMessage優先?
例如,只有在隊列中沒有其他消息時,纔會處理IIRC,WM_PAINT
消息。是否有可能實現與自定義消息類似的行爲?
如果我使用具有特殊參數的WM_PAINT
爲了向窗口(我控制WndProc)提供自定義消息,它會有類似的行爲嗎?
是否可以優先使用PostMessage
(或任何其他相關方法)發送的消息?PostMessage優先?
例如,只有在隊列中沒有其他消息時,纔會處理IIRC,WM_PAINT
消息。是否有可能實現與自定義消息類似的行爲?
如果我使用具有特殊參數的WM_PAINT
爲了向窗口(我控制WndProc)提供自定義消息,它會有類似的行爲嗎?
對於WM_PAINT
DefWndProc
中的窗口代碼只是設置一個標誌,然後只在隊列爲空時檢查該標誌,下一次調用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。這種方法不需要自定義消息。
我想要一個後臺線程來通知主要的那個結果可以顯示給用戶。但是,如果您只是將消息發佈到主線程,它將立即得到處理。
這導致應用程序不響應繪畫或用戶輸入消息,因爲我發佈的消息總是優先。
我使用的技巧是知道WM_TIMER
消息的優先級低於WM_PAINT
消息。
因此,而不是發佈消息到主窗體,我會設置一個計時器。
定時器信息的優先級低於
不知道我理解的標誌方法。用戶界面隊列是單線程的,所以你永遠不會遇到這種情況(或者如果你指的是避免多個隊列的重入,我不認爲它與優先級有關)。使用自定義消息+單獨的PQ是一個好主意,儘管優先級不會與其他「非定製」消息一起使用。我想知道有沒有一些內部機制? – sold 2009-11-25 16:51:26
哎呀,一半睡着了,忘記了單個用戶界面線程 - 驚人的是,當你沒有每天處理這些東西時,你忘記了多快。 – devstuff 2009-11-26 02:03:37