2015-06-23 20 views
0

我正在編寫一個封裝了一些媒體基礎功能的庫。我希望能夠通過回調網絡攝像頭與系統連接/斷開連接的方式通知圖書館用戶。 MSDN describes how to know when a camera is disconencted,但它使用消息循環讓你知道這一點。我不太瞭解Windows消息循環,但是我在this MSDN article中讀到的內容告訴我必須有一個窗口才能有消息循環,這對於庫是不可接受的。使用Windows消息循環來接收我正在寫的庫中的事件

所以,我有幾個問題:

  1. 我可以在一個新的線程創建一個消息循環,並接收由第一鏈接描述的通知消息? (我希望它在一個新線程中,以便它不會阻止庫用戶的線程,那麼庫用戶調用setCameraChangeCallback(...),這會啓動內部的消息循環。)如果是這樣,我應該使用哪些創建消息循環的函數?

  2. 我可以在不創建任何窗口的情況下執行此操作嗎?這是一個圖書館,所以如果一個圖書館用戶名爲setCameraChangeCallback(...)並且突然出現一個窗口,那將會非常奇怪。再次,對如何做到這一點的解釋(函數名稱,使用的特定參數等)非常受歡迎。

  3. 我的庫可以在Windows應用程序中沒有問題的情況下使用嗎?這意味着使用我的庫的Windows應用程序可能已經創建了一個窗口,並且它自己的消息循環正在運行。我的消息循環在單獨的線程中運行會干擾庫用戶的消息循環嗎?如果是這樣,如何避免這種情況?

  4. 是否有什麼阻止我創建兩個或多個帶有消息循環的線程,每個線程都被註冊以獲取相機更改事件的通知?

回答

0

這MSDN文章告訴我,我必須爲了有消息循環,這是一個圖書館不可接受的窗戶。

並非如此。創建一個message only window,甚至只是一個隱藏的窗口。讓該窗口收到通知消息,然後轉發它們。

如果您願意或不願意,您可以選擇在專用線程內完成此操作。無論哪個線程執行創建窗口的代碼都被認爲是窗口的擁有線程。消息被髮送到該線程。該線程必須發送消息才能讓窗口接收它們。

從表面上看,你可能會認爲在專用線程中創建窗口並將其與主機應用程序隔離會更清晰。這有好處,但成本是,你需要考慮當你想轉發通知事件時會發生什麼。您收到的消息將到達您的專用線程。如果直接轉發事件,則庫的主機將最終在專用線程中異步執行代碼。那真的是你想要的嗎?

更常見的方法將會看到最初請求接收通知的主機線程中觸發的事件。這意味着你的庫將不得不要求主機應用程序分派消息。

顯然你在這裏有一些選擇。但底線是你不應該相信庫代碼不能創建窗口。 Windows不需要顯示,只有消息窗口是專門爲您的使用場景設計的。