Linux では、カウントダウン タイマーとなる fork() を使用して子プロセスを作成します。タイマーが終了すると、子プロセスは親プロセスにシグナルを送信して、タイマーが終了したことを伝えます。親プロセスは、それに応じてシグナルを処理する必要があります。
Windowsでこれを行う方法がわかりません。ここでスレッドの使用を推奨する人もいますが、その方法を示すサンプル コードを書いたことはありません。
最も重要なことは、タイマーが非ブロッキングであることです。つまり、プログラムがユーザーからの入力を受け入れて通常どおり処理している間、タイマーはバックグラウンドでカウントダウンを続けます。
方法を教えてください。
編集:
アプリケーションはコンソール 1 です。そしてサンプルコードを見せてください。ありがとう!
アップデート:
ここでいくつかの提案を読んだ後、ここでいくつかの回答を検索し、これが役に立ちました。
次に、以下のコードを書きました。これは機能しますが、想定どおりではありません。
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
#define TIMER_VALUE (5 * 1000) //5 seconds = 5000 milli seconds
HANDLE g_hExitEvent = NULL;
bool doneInTime = false;
string name;
bool inputWords();
//The below function will be called when the timer ends
void CALLBACK doWhenTimerEnds(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
if(!doneInTime)
{
cout << "\nOut of time ... try again ..." << endl;
name = "";
doneInTime = inputWords();
}
SetEvent(g_hExitEvent);
}
bool inputWords()
{
/* doWhenTimerEnds() will be called after time set by 5-th parameter and repeat every 6-th parameter. After time elapses,
callback is called, executes some processing and sets event to allow exit */
HANDLE hNewTimer = NULL;
BOOL IsCreated = CreateTimerQueueTimer(&hNewTimer, NULL, doWhenTimerEnds, NULL, TIMER_VALUE, 0, WT_EXECUTELONGFUNCTION);
g_hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
cout << "Input your name in 5 seconds .. " << endl;
std::getline(cin, name);
DeleteTimerQueueTimer(NULL, hNewTimer, NULL);
return true;
}
int main()
{
doneInTime = inputWords();
cout << "Hello, " << name << "! You're done in time" << endl;
//WaitForSingleObject(g_hExitEvent, 15000);
system("pause");
return 0;
}
問題は、中断された getline() が停止せず、後続の getline() が以前に入力されたテキストを読み取ってしまうことです! どうすればそれを修正できますか? また、もっと良い方法があれば教えていただけないでしょうか。