2

DebugConsole というグローバル変数があります。Alloc Console を使用してコンソールを作成し、std::cout と std::cin をリダイレクトします。

問題は、コンソールが生成されたとき、すべてがうまくいっているということです。ただし、 std::cin.get() を使用すると、ブロックされ、アプリケーションの残りの部分はクリックできなくなります。そこで、std::cin.get() をスレッド化することにしました。キーを押すと、コンソールが正常に閉じます。ボックスのチェックを外すと問題が発生します。std::cin.get() がスレッドの移動をブロックしているため、スレッドは参加できません。したがって、応答する前に最初に入力する必要があります。これにより、アプリケーション全体がフリーズします。

任意のキーを押すとコンソールが終了するか、ボックスのチェックを外すとコンソールが閉じられるようにしようとしています。

if (ButtonChecked)
{
    std::cout<<"To close this window: \nRemove the checkmark from the Extract Box OR Press Any Key..\n"<<std::flush;

    DebugConsole.StartThread([window]{  //create an std::thread and run the lambda in it.
        std::cin.get();
        DebugConsole.StopThread();  //join the thread.
        DebugConsole(false, false);  //close the console.
        UncheckBox(DebugBox);
    });
}
else
{
     DebugConsole.StopThread(); //basically just joins the thread..
     UncheckBox(DebugBox);
}

問題のコードは上記です。どうすればそれを達成できますか?

4

2 に答える 2

1

GetAsyncKeyState(VK_RETURN) & 1std :: cin.get()とstd :: cin.peek()の代わりに使用して解決しました。

他のすべてのコードは問題ありませんでした。cin.getだけで、peekはブロックを停止しません。ユーザー入力を待機し続けたため、スレッドの参加/切断がブロックされていました。

于 2012-12-28T20:12:20.573 に答える
1

メインスレッド(DebugConsole.StartThread()関数呼び出しの後)はスレッドとの結合を行う必要があります-もちろん、スレッドIDを知っている必要があるため、おそらくthreadid = DebugConsole.StartThread(...); それを機能させる必要があります。

于 2012-12-28T17:22:28.717 に答える