在 Linux 上,我将使用 fork() 创建一个子进程,这将是我的倒数计时器,一旦计时器结束,子进程将向父进程发送一个信号,告诉它计时器已经结束。然后父进程应该相应地处理信号。
我不知道如何在 Windows 上执行此操作。这里有些人建议使用线程,但他们从未编写任何示例代码来说明如何做到这一点。
最重要的是计时器是非阻塞的,这意味着它在后台保持倒计时,而程序正在接受用户的输入并正常处理它。
你能告诉我怎么做吗?
编辑:
该应用程序是一个控制台。请给我看示例代码。谢谢!
更新:
所以在我阅读了这里的一些建议之后,我在这里搜索了一些答案,发现这个很有帮助。
然后我写了下面的代码,它可以工作,但不是应该的:
#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() 甚至会读取之前输入的文本!请问我该如何解决?如果有更好的方法,你能指出我吗?