私は関数を非同期で実行したいアプリケーションでstd::async
を使用しています。この関数からはSendMessage
関数を使用してワーカースレッドからUIに話します。 Visual Studioの2013年に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);
}
を期待通りに上記のコードは動作します。以下は、私がやっている実証MFCのテストアプリケーションからの抽出物です。ボタンを押すと "Hello World"というメッセージボックスが表示され、そのメッセージボックスで[OK]をクリックすると "Hello World Again"というメッセージボックスが表示されます。
私が直面している問題は、上記のコードをVisual Studio 2015コンパイラに移行すると、SendMessage
関数呼び出し後にアプリケーションがハングすることです。
オンラインで(this questionへの回答)読むと、std::future
のデストラクタが記述されています。私はから返されたstd::future
を格納するためにVisual Studio 2015のコードを変更しました。それは問題を修正するようです(アプリケーションがハングしないため、2番目のメッセージボックスが表示されます)。しかし、std::future
のコードを見ると、Visual Studio 2013と2015の間に何か違うものは見えないようです。そのため、私の質問には何か変わったのですが、そのような動作の原因となるのはstd::async
ですか?
おかげ
「async」によって返された未来のデストラクタが常にブロックされる必要があったので、2013年にはバグだったと確信しています。 [この質問](http://stackoverflow.com/questions/43600159/msvc-2013-stdasync-works-asynchronously-without-wait)は同じ動作を示します。 VS2013には、C++ 11のサポートがうまくいきませんでした。 VS2015のアップデート3または2017はより忠実です。 – NathanOliver
ああ、未来のことと魔法のデッドロックを阻む「非同期」の素晴らしい世界... 42:30頃、[このプレゼンテーション](https://www.youtube.com/watch?v=QIHy8pXbneI)を試してみてください。 –
別のスレッドからSendMessage()を試行しないでください。おそらくブロックされます。 Use PostMessage() –