2016-10-20 16 views
0

は、次のコードを考えてみましょう:私はcrossValidate()が呼び出されたとき、プログラム全体がcrossValidate()実行に時間がかかるという理由だけで、凍結されたことが実現するまでC++ WINAPI - ボタンをクリックしたときに、新しいスレッドが致命的なエラーが発生し

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()の新しいスレッドを開始することです。そして、それは私がやったまさにです:

std::thread crossValidateThread; // global 
// ... 
// ... 

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

は今プログラムが凍結されていなかったが、私は2つの新しい問題を抱えて:

1)crossValidate()仕上げが、それは実行だときは、ROC曲線を表示するウィンドウは、単に消える(2最後を参照してください初回のみを動作crossValidate()crossValidate()内のコードの行)

2)。私は何を意味して初めて、私は(消えまだROCウィンドウ)ボタンcrossValidate()実行をクリックしていることですが、私はボタンをもう一度押すと、それは最初の実行だ後にプログラムが致命的なエラーでクラッシュします。

+0

デバッガでプログラムを実行した場合、あなたはどのような結果を得るのですか?まあ@xaxxon – xaxxon

+0

は、私がvs13を使用し、それがないすべてははい、それが消えてしまうことを意味するものではありません致命的なエラー – DimChtz

+0

@Someprogrammerdudeを言って、ウィンドウが表示されています。私はスレッドを切り離すべき私は 'crossValidateは()'ウィンドウが – DimChtz

答えて

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

開始されているが結合されていない、または切り離されていないstd :: threadに割り当てると、プログラムは終了します。

初めて、それはまだ開始されていないので、それは大丈夫です。 2回目に既にスレッドがあるので、プログラムがクラッシュします。

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

これが(真==)(合流可能)関連するスレッドを持っている*場合は、STD ::終了()が呼び出されます。

+0

を消えない呼び出すためにスレッドを使用していないとき、私は意味ですか? – DimChtz

+0

@DimChtzどちらか、または新しいスレッドを作成する前に古いものに参加してください。 –

+0

それは完了したかどうかを知る必要があるかどうかによって異なります。 join()は完了するまでブロックします。 N個の並行スレッドを格納する必要がある場合は、それらのベクトルを作成する必要があります。 – xaxxon

関連する問題