我在需要異步運行函數的應用程序中使用std::async
,並且使用SendMessage
函數使用SendMessage
函數從工作線程與UI交談。下面是從MFC測試應用程序的提取物證明我在做什麼:在Visual Studio 2013和2015之間的std :: async中的不同行爲
LRESULT CStdAsyncProjDlg::OnUserPlusOne(WPARAM, LPARAM)
{
MessageBox("Message", "Hello World Again", MB_OK);
return 0;
}
// Function that contains the async work.
void TestAsync(HWND hDlg)
{
// Send a message to the UI from this worker. The WM_USER + 1 message
// handler is CStdAsyncProjDlg::OnUserPlusOne
SendMessage(hDlg, WM_USER + 1, 0, 0);
}
// This event is fired when a button is pressed on the MFC dialog.
void CStdAsyncProjDlg::OnBnClickedButton1()
{
MessageBox("Message", "Hello World", MB_OK);
std::async(std::launch::async, TestAsync, m_hWnd);
}
在Visual Studio 2013上面的代碼按預期工作。當我按下按鈕時,我會看到一個顯示「Hello World」的消息框,一旦我在該消息框上單擊確定,我就會看到另一個顯示「Hello World Again」的消息框。
我面臨的問題是,一旦我將上面的代碼遷移到Visual Studio 2015編譯器,應用程序掛起SendMessage
函數調用後。
在線閱讀(回答this question)它提到了std::future
塊的析構函數。我已經更改了Visual Studio 2015中的代碼以存儲從std::async
返回的std::future
,這似乎解決了問題(應用程序未掛起,並且我收到第二個消息框)。然而,看看std::future
的代碼,我看不出在Visual Studio 2013和2015之間有什麼不同。所以我的問題是std::async
會導致這種行爲的工作方式發生了什麼變化?
感謝
我很確定這是2013年的一個bug,因爲'async'返回的將來的析構函數一直需要阻塞。 [這個問題](http://stackoverflow.com/questions/43600159/msvc-2013-stdasync-works-asynchronously-without-wait)表現出相同的行爲。 VS2013有很好的C++ 11支持。 VS2015更新3或2017更加合規。 – NathanOliver
啊,'異步'的奇妙世界,阻止未來和魔術僵局......請嘗試[此演示文稿](https://www.youtube.com/watch?v=QIHy8pXbneI),大約42:30。 –
不要嘗試從單獨的線程SendMessage(),它很可能會阻止。使用PostMessage() –