2014-02-09 65 views
1

我已經使用Visual Studio嚮導創建了一個新的Win32 Windows應用程序。並將Boost.Asio添加到該項目中。我想用deadline_timer每秒做一些重複的工作。雖然計時器(及其線程)運行良好,但我鼓勵UI不更新的問題,因爲io_service.run()阻塞了UI線程。經過快速搜索,我發現this thread。這其實是同樣的問題!所以,我將代碼移到了GetMessage()循環中,並將io_service.run()更改爲io_service.poll_one()。Boost.Asio Win32 Windows應用程序

// Main message loop: 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    //Windows main loop stuff 
    if (io.stopped()) 
     io.reset(); 
    io.poll_one(); 
} 

嗯,它的工作,但只有當有Windows消息等待,這是顯而易見的。我還有什麼可以做的嗎?或者我應該使用WinAPI線程而不是boost?

+0

也許試試'PeekMessage'? – ooga

+0

你也可以嘗試'io_service.poll()'而不是'io_service.poll_one()' – kenba

+0

@kenba'io_service.poll()'和'io_service.poll_one()'在我的項目中是相同的,因爲只有一個處理器。 – Hiale

回答

0

它不像Boost那樣可移植,但Windows已經提供了與消息循環集成的好事件API。

您可以使用CreateWaitableTimer並用MsgWaitForMultipleObjects替換GetMessage。然後循環會喚醒輸入的消息或計時器。其他類型的手柄也可以使用。

當然,總是有SetTimer這會導致您收到WM_TIMER消息。但我更喜歡等待定時器。

+0

'CreateWaitableTimer'實際上是一個很好的選擇,因爲這個項目不必是可移植的。謝謝! – Hiale

+0

@Hiale:是的,如果你的代碼已經有了'GetMessage',那麼它就和Win32 API緊密結合,你不應該害怕使用其他的Windows功能。我喜歡'MsgWaitForMultipleObjects'和'Ex'版本。他們讓我在單個線程上管理任何一組任務,而無需擔心競爭狀況。 –

相關問題