我有一個STA線程,我正在執行一些操作。由於環境(辦公室)的限制,在某些時候我不能做某些事情。但是,我可以在當前消息泵循環完成後立即執行這些操作。以「PostMessage」方式調用COM對象
我通常會用我自己的message-only窗口句柄來做到這一點,我將使用PostMessage發佈消息。但是,考慮到環境和架構,操作與來自其他線程/進程的其他COM對象調用一起排隊非常重要。或者更準確地說,調用後操作需要在CoWaitForMultipleHandles調用中執行。
COM(+)提供了一種機制來調用方法「稍後」?以外:
- 自己創建一個線程(或以其他方式重用我自己創建的線程)。使其成爲STA線程。將我的對象接口編組爲該線程。使用ICallFactory爲我的異步界面創建一個調用對象。從這個輔助線程中消失並忘記。
- 嚴格爲回發創建MTA對象(目標COM服務器仍然是原始STA線程上的STA對象)。實例化時,COM將爲我創建一個線程。調用該MTA對象來安排回發(使用與以前相同的ICallFactory方法)。
- 挖出COM調度窗口句柄和PostMessage。
前兩個需要單獨的線程,這似乎是不可取的。最後是一個黑客。
很不清楚「當前消息泵循環」可能意味着什麼。如果你需要稍後發生的事情,那麼最簡單和風險最小的方法就是使用SetTimer()。 –
SetTimer將需要我自己的WndProc,我可以通過創建我自己的窗口(其消息不會在CoWaitForMultipleHandles中處理)或覆蓋com調度程序窗口(hack)的WndProc來獲得。 –
[製作和處理異步調用](https://msdn.microsoft.com/en-us/library/windows/desktop/ms692623%28v=vs.85%29.aspx)。 – arx