C ++ winapi-单击按钮上的新线程导致致命错误
C++ winapi - new thread on button click causes fatal error
考虑以下代码:
static void crossValidate(HWND hwnd) {
// Do-stuff (image processing mostly)
cv::imshow("ROC CURVE", roc);
cv::waitKey(1);
}
static LRESULT mainOnCommand(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch (wmId) {
// ...
case IDMC_CROSSVALID: { crossValidate(hwnd); break; }
// ...
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
// ...
case WM_COMMAND: return mainOnCommand(hwnd, msg, wParam, lParam); break;
// ...
}
一切都很好,直到我意识到调用 crossValidate()
时整个程序都被冻结了,这仅仅是因为 crossValidate()
执行需要几个小时才能完成并且 window 无法接收其他消息。我想我需要的是为 crossValidate()
启动一个新线程。这正是我所做的:
std::thread crossValidateThread; // global
// ...
// ...
// Inside mainOnCommand()
// ...
case IDMC_CROSSVALID: { crossValidateThread = std::thread(crossValidate,hwnd); break; }
// ...
现在程序没有冻结,但我有 2 个新问题:
1) 当crossValidate()
完成它的执行时,显示ROC 曲线的window 就消失了(见crossValidate()
中的最后两行代码)
2) crossValidate()
只适用于第一次。我的意思是,我第一次单击按钮 crossValidate()
时执行(仍然 ROC window 消失),但在第一次执行后,如果我再次按下按钮,程序会崩溃并出现致命错误。
crossValidateThread = std::thread(crossValidate,hwnd);
如果您分配给已启动但未加入或分离的 std::thread,您的程序将结束。
第一次,还没开始,还好。第二次,那里已经有一个线程,所以你的程序崩溃了。
http://en.cppreference.com/w/cpp/thread/thread/~thread
If *this has an associated thread (joinable() == true), std::terminate() is called.
考虑以下代码:
static void crossValidate(HWND hwnd) {
// Do-stuff (image processing mostly)
cv::imshow("ROC CURVE", roc);
cv::waitKey(1);
}
static LRESULT mainOnCommand(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch (wmId) {
// ...
case IDMC_CROSSVALID: { crossValidate(hwnd); break; }
// ...
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
// ...
case WM_COMMAND: return mainOnCommand(hwnd, msg, wParam, lParam); break;
// ...
}
一切都很好,直到我意识到调用 crossValidate()
时整个程序都被冻结了,这仅仅是因为 crossValidate()
执行需要几个小时才能完成并且 window 无法接收其他消息。我想我需要的是为 crossValidate()
启动一个新线程。这正是我所做的:
std::thread crossValidateThread; // global
// ...
// ...
// Inside mainOnCommand()
// ...
case IDMC_CROSSVALID: { crossValidateThread = std::thread(crossValidate,hwnd); break; }
// ...
现在程序没有冻结,但我有 2 个新问题:
1) 当crossValidate()
完成它的执行时,显示ROC 曲线的window 就消失了(见crossValidate()
中的最后两行代码)
2) crossValidate()
只适用于第一次。我的意思是,我第一次单击按钮 crossValidate()
时执行(仍然 ROC window 消失),但在第一次执行后,如果我再次按下按钮,程序会崩溃并出现致命错误。
crossValidateThread = std::thread(crossValidate,hwnd);
如果您分配给已启动但未加入或分离的 std::thread,您的程序将结束。
第一次,还没开始,还好。第二次,那里已经有一个线程,所以你的程序崩溃了。
http://en.cppreference.com/w/cpp/thread/thread/~thread
If *this has an associated thread (joinable() == true), std::terminate() is called.