我有一個多對話框MFC客戶端應用程序,我正在努力。這個客戶端可以接收大量的消息(> 10Hz)到主對話框,該對話框通常執行一些小功能,然後將該消息轉發到另一個對話框進行處理。
在我的具體情況中,主對話框接收與車輛位置有關的消息,更新該GUI上的一對欄位,然後在PostMessage上將其傳遞到顯示所有車輛信息的窗口。WindProc爲我做了什麼?
所以基本上,我的問題是這樣的:發佈消息或只是調用dialog.update(這是我創建的函數)之間的區別是什麼?
我有一個多對話框MFC客戶端應用程序,我正在努力。這個客戶端可以接收大量的消息(> 10Hz)到主對話框,該對話框通常執行一些小功能,然後將該消息轉發到另一個對話框進行處理。
在我的具體情況中,主對話框接收與車輛位置有關的消息,更新該GUI上的一對欄位,然後在PostMessage上將其傳遞到顯示所有車輛信息的窗口。WindProc爲我做了什麼?
所以基本上,我的問題是這樣的:發佈消息或只是調用dialog.update(這是我創建的函數)之間的區別是什麼?
那麼,因爲我們不知道你的dialog.update()做了什麼,我們怎麼才能知道它們有什麼不同呢?
如果你正在做另一個PostMessage,我不確定那是什麼意思。您的程序必須等待消息循環的另一次迭代才能檢索新發布的消息,並且可能會在發佈消息之前收到另一條消息。您可以使用SendMessage來代替PostMessage,它將直接將消息發送到WndProc,而無需爲其他消息迭代消息循環。
我在想,如果你是多線程的,那麼發送或發佈消息會更安全一些,因爲Windows應該自動切換上下文。如果你是單線程的,那麼它可能無關緊要。
我相信你的應用程序是多線程的,其中一個線程接收數據,並且與GUI線程不同。您只能從其他線程使用PostMessage
到此對話框,而不能使用SendMessage
或直接呼叫。
如果您收到的消息太多,您應該緩衝它們 - 通過計數(例如5000)或某個超時。您可以保留郵件到vector
,list
或您喜歡的任何其他收藏集。稍後,在發送時,將此集合的地址作爲WPARAM
(或LPARAM
)發佈到對話框。 Dialog將會得到它,並且可以處理它。這種方法可能不正確,因爲我不知道應用程序的其他設計問題。
您需要反覆試驗的方法,看看你在哪裏獲得實際的性能和穩定性的好處。
是的程序是多線程的。假設第二個windproc調用與dialog.update()相同的函數。 有人告訴我Post Message發送出去,並不等待更新完成,但是如果我執行dialog.update(),那麼我的代碼將不會繼續,直到更新完成。是這樣嗎? – Jason 2012-07-18 12:07:24
是的,基本上。 PostMessge所做的一切都是在擁有窗口的線程的消息隊列中放入一條消息,然後返回。擁有該窗口的線程必須隨後抽取消息,直到獲取到您發佈給它的消息。但是,如果您執行SendMessage,則消息將立即轉到窗口的WndProc,並且在處理消息之前不會返回。 – 2012-07-18 14:28:59
所以在3個選項:1)發佈消息,2)發送消息,和3)Dialog.update(),這是我有: 1)將立即發佈並返回。消息的接收者將處理消息 2)將立即發佈,但等待接收者完成後再返回。 3)同樣沒有。 2. 我讀的是嗎? – Jason 2012-07-18 18:56:50