From d4c170dbd676bfdc73c742c5ba0116a2af9e452f Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Mon, 1 Apr 2024 09:27:15 +0900 Subject: [PATCH] wait for thread terminations --- XG_CancelFromWordsDialog.hpp | 2 ++ XG_CancelGenBlacksDialog.hpp | 2 ++ XG_CancelSmartSolveDialog.hpp | 2 ++ XG_CancelSolveDialog.hpp | 2 ++ XG_CancelSolveNoAddBlackDialog.hpp | 2 ++ crossword_generation.hpp | 12 +----------- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/XG_CancelFromWordsDialog.hpp b/XG_CancelFromWordsDialog.hpp index 104313b..5079f51 100644 --- a/XG_CancelFromWordsDialog.hpp +++ b/XG_CancelFromWordsDialog.hpp @@ -109,6 +109,8 @@ class XG_CancelFromWordsDialog : public XG_Dialog ::KillTimer(hwnd, uTimerID); // 計算時間を求めるために、終了時間を取得する。 xg_dwlTick2 = ::GetTickCount64(); + // スレッドを待つ。 + XgWaitForThreads(); // ダイアログを終了する。 ::EndDialog(hwnd, IDOK); } else { diff --git a/XG_CancelGenBlacksDialog.hpp b/XG_CancelGenBlacksDialog.hpp index 123dc02..5108735 100644 --- a/XG_CancelGenBlacksDialog.hpp +++ b/XG_CancelGenBlacksDialog.hpp @@ -97,6 +97,8 @@ class XG_CancelGenBlacksDialog : public XG_Dialog ::KillTimer(hwnd, uTimerID); // 計算時間を求めるために、終了時間を取得する。 xg_dwlTick2 = ::GetTickCount64(); + // スレッドを待つ。 + XgWaitForThreads(); // ダイアログを終了する。 ::EndDialog(hwnd, IDOK); // スレッドを閉じる。 diff --git a/XG_CancelSmartSolveDialog.hpp b/XG_CancelSmartSolveDialog.hpp index 7132065..d0fd47e 100644 --- a/XG_CancelSmartSolveDialog.hpp +++ b/XG_CancelSmartSolveDialog.hpp @@ -125,6 +125,8 @@ class XG_CancelSmartSolveDialog : public XG_Dialog ::KillTimer(hwnd, uTimerID); // 計算時間を求めるために、終了時間を取得する。 xg_dwlTick2 = ::GetTickCount64(); + // スレッドを待つ。 + XgWaitForThreads(); // 解を求めようとした後の後処理。 XgEndSolve(); // ダイアログを終了する。 diff --git a/XG_CancelSolveDialog.hpp b/XG_CancelSolveDialog.hpp index de5fa52..f72b936 100644 --- a/XG_CancelSolveDialog.hpp +++ b/XG_CancelSolveDialog.hpp @@ -145,6 +145,8 @@ class XG_CancelSolveDialog : public XG_Dialog ::KillTimer(hwnd, uTimerID); // 計算時間を求めるために、終了時間を取得する。 xg_dwlTick2 = ::GetTickCount64(); + // スレッドを待つ。 + XgWaitForThreads(); // 解を求めようとした後の後処理。 XgEndSolve(); // ダイアログを終了する。 diff --git a/XG_CancelSolveNoAddBlackDialog.hpp b/XG_CancelSolveNoAddBlackDialog.hpp index 582f7c4..7bbe523 100644 --- a/XG_CancelSolveNoAddBlackDialog.hpp +++ b/XG_CancelSolveNoAddBlackDialog.hpp @@ -132,6 +132,8 @@ class XG_CancelSolveNoAddBlackDialog : public XG_Dialog ::KillTimer(hwnd, uTimerID); // 計算時間を求めるために、終了時間を取得する。 xg_dwlTick2 = ::GetTickCount64(); + // スレッドを待つ。 + XgWaitForThreads(); // 解を求めようとした後の後処理。 XgEndSolve(); // ダイアログを終了する。 diff --git a/crossword_generation.hpp b/crossword_generation.hpp index 15a7d07..06e246f 100644 --- a/crossword_generation.hpp +++ b/crossword_generation.hpp @@ -119,17 +119,6 @@ inline void reset() noexcept { #endif } -// 生成済みかキャンセル済みかを待つ。このような待ち方はモダンではない。 -// ここのコードはモダンな方法に置き換えられるべき。 -inline void wait_for_threads(int num_threads = get_num_processors(), int retry_count = 3) { - constexpr int INTERVAL = 100; - for (int i = 0; i < retry_count; ++i) { - if (s_generated || s_canceled) - break; - std::this_thread::sleep_for(std::chrono::milliseconds(INTERVAL)); - } -} - // 連結性を判定。 template inline bool @@ -2031,6 +2020,7 @@ struct non_add_block_t { try { // スレッドを生成。切り離す。 std::thread t(generate_proc, pboard, pwords, i); + xg_ahThreads[i] = t.native_handle(); t.detach(); } catch (std::system_error&) { delete pboard;