0

ステップバイステップのゲームの特定のレベルの解決策を見つける (または解決策が存在しないことを証明する) C++ で記述されたコンソール Windows アプリケーションがあります。それを「ソルバー」と呼びましょう。このアプリケーションは、すべてのゲーム レベルで Python スクリプトからループで起動されます。一部のレベルは難しすぎて、それらを解決するのに何時間も何日もかかります。

私のアプリケーションが「難しすぎるレベル」などの文字列を出力して終了し、Python スクリプトが次のレベルに移動できるようにすることができれば、受け入れられます。 、30分。

開始から 30 秒後にソルバーを中断するにはどうすればよいですか? 技術的には、アルゴリズムを解くことは、 から呼び出される単なる再帰手順int main()です。

起動してから 30 分後に起動し、ブール値のフラグを設定するセカンダリ スレッドを作成することを考えています。そして、プライマリ(解決)スレッドはこのフラグを定期的にチェックします。

これは機能しますが、よりシンプルでエレガントなソリューションはありませんか?

4

2 に答える 2

2

あなたのコードはメッセージ駆動型の方法で実行されていないため、ここでタイマーが必要かどうか、または適切かどうかさえわかりません。タイムアウトが必要かどうかを定期的にチェックするメインの計算スレッドが必要であることはおそらく正しいでしょう。その場合、タイマーを持つ別のスレッドは必要ありません。計算が開始された時刻を覚えておいてください。タイムアウトをチェックするたびに、30 秒が経過したかどうかを確認してください。

擬似コード:

startTime = now();
while (doingCalc)
{
    DoSomeMoreCalc();
    if (now() - startTime) > 30.0)
        timeOut();
}
于 2013-11-13T16:30:02.903 に答える
0

これが機能するかどうかはわかりませんが、試してみる価値はあります..

#include <windows.h>
#include <iostream>
#include <thread>

UINT_PTR ID = NULL;

void __stdcall OnTimerEvent(HWND hwnd, UINT msg, UINT_PTR id, DWORD dwTime)
{
    std::cout<<"HERE\n";
    KillTimer(NULL, ID);
}

int main()
{
    std::thread([] {
        MSG msg = {0};
        ID = SetTimer(NULL, 0, 3000, &OnTimerEvent); //3 second timer.

        while(GetMessage(&msg, NULL, 0, 0))
        {
            DispatchMessage(&msg);
        }

        KillTimer(NULL, ID);
    }).detach();

    std::cin.get();
}
于 2013-11-13T16:55:45.333 に答える