考虑以下代码:

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()的执行需要花费数小时才能完成,并且窗口无法接收其他消息。我想我需要为crossValidate()启动一个新线程。这正是我所做的:
std::thread crossValidateThread; // global
// ...
// ...

// Inside mainOnCommand()
// ...
case IDMC_CROSSVALID: { crossValidateThread = std::thread(crossValidate,hwnd); break; }
// ...

现在程序没有冻结,但是我有两个新问题:

1)crossValidate()完成执行后,显示ROC曲线的窗口将消失(请参见crossValidate()内的最后两行代码)

2)crossValidate()仅在第一次使用。我的意思是,第一次单击按钮crossValidate()会执行(仍然ROC窗口消失),但是在第一次执行后,如果再按一次按钮,程序将因致命错误而崩溃。

最佳答案

crossValidateThread = std::thread(crossValidate,hwnd);

如果您分配给已启动但尚未加入或分离的std::thread,则程序将结束。

第一次,它还没有开始,所以很好。第二次,那里已经有一个线程,因此您的程序崩溃了。

http://en.cppreference.com/w/cpp/thread/thread/~thread

关于c++ - C++ Winapi-单击按钮时出现新线程会导致致命错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40158294/

10-13 03:21