C++ 如何使Windows计时器在后台线程中运行

C++ 如何使Windows计时器在后台线程中运行,c++,windows,C++,Windows,问题:你如何在背景中让计时器滴答作响?这就是创建计时器线程的线程在时钟滴答作响时仍然可以执行其他操作 尝试: -使用\u beginthreadex()-->它似乎有竞争条件 class Timer{ ... static unsigned __stdcall tick(void *param){ while(1){ Timer::timer++; Sleep(Timer::timer*1000); } return 1; } } .

问题:你如何在背景中让计时器滴答作响?这就是创建计时器线程的线程在时钟滴答作响时仍然可以执行其他操作

尝试: -使用\u beginthreadex()-->它似乎有竞争条件

class Timer{
 ...
 static unsigned __stdcall tick(void *param){
    while(1){
        Timer::timer++;
        Sleep(Timer::timer*1000);
    }
    return 1;
}
}

.....
HANDLE time_thread = (HANDLE) _beginthreadex(0, 0, &Timer::tick,0,0,NULL);
...
//test for 20 seconds
//want to do something while the clock is not 20 seconds
//the mainthread here still has to receive input
//What is the proper way to do it?

while (Timer::getTime() != 20){
   cout << Timer::getTime()
}

CloseHandle(time_thread);
...
类计时器{
...
静态无符号调用勾号(void*param){
而(1){
定时器::定时器++;
睡眠(定时器::定时器*1000);
}
返回1;
}
}
.....
HANDLE time_thread=(HANDLE)_beginthreadex(0,0和Timer::tick,0,0,NULL);
...
//测试20秒
//想在时钟不到20秒的时候做点什么吗
//这里的主线程仍然必须接收输入
//正确的方法是什么?
while(Timer::getTime()!=20){

cout恐怕您误解了系统计时器的工作原理以及如何使用它们-关键是它们会自动在后台运行,因此您不必自己进行线程管理

这里有Windows定时器的一般示例和说明,如果您尝试运行自己的
定时器
类,可以使用它:

这是Windows.NET附带的
Timer
类,底部有一个代码示例:

编辑以添加:

下面是一个适用于非MFC应用程序的Win32定时器示例(来自Turiorial页面):

int nTimerID;

void Begin(HWND hWindow_who_gets_the_tick)
{
    // create the timer to alert your window:
    nTimerID = SetTimer(hWindow_who_gets_the_tick, uElapse, NULL);
}

void Stop()
{
    // destroy the timer
    KillTimer(nTimerID);
}
有关详细信息,请参阅

然后在窗口过程中,您会收到
WM_TIMER
消息,并根据需要进行响应


或者,计时器可以调用用户定义的过程。有关详细信息,请参阅。

我不确定这里的内容有什么问题。您已经创建了一个线程,该线程将永远更新成员变量
timer
,它的主要用途是打印(大概是打印)的紧密/快速循环直到它达到20。它没有做什么?从技术上讲,增加该值与在另一个线程中检查该值是有竞争条件的,但是对于本例来说,它应该是好的

编辑:对于具有完全输入控制的非阻塞输入,请尝试以下操作:

HANDLE hStdIn = GetStdHandle( STD_INPUT_HANDLE );
while ( true ) {
    if ( WAIT_OBJECT_0 == WaitForSingleObject( hStdIn, 1000 ) ) {
        // read input
        INPUT_RECORD inputRecord;
        DWORD events;
        if ( ReadConsoleInput( hStdIn, &inputRecord, 1, &events ) ) {
            if ( inputRecord.EventType == KEY_EVENT ) {
                printf( "got char %c %s\n",
                    inputRecord.Event.KeyEvent.uChar.AsciiChar,
                    inputRecord.Event.KeyEvent.bKeyDown ? "down" : "up" );
            }
        }
    }
    printf( "update clock\n" );
}

我来看看。谢谢。有没有没有没有MFCit的解决方案会打印成:0000000 111111111111 222222222222333333333333333333…等等。你是如何使它在递增时,主线程仍然可以接收输入的呢?比如说。如果不是20,你仍然可以输入word。我们说的是控制台程序还是Windows GUI程序?如果您只是想检查控制台输入20秒,如果没有,请继续,您应该查看
GetStdHandle(STD\u input\u HANDLE)
WaitForSingleObject
跳过该线程。您可能还需要根据您尝试执行的操作设置控制台模式。它不是GUI程序,而是控制台。我只想制作一个简单的时钟,在某些时间点我可以做其他事情(调用end之类的函数),但当它滴答作响时,我可以在控制台上输入。您可以在标准输入句柄上使用
WaitForSingleObject
,循环1000毫秒(1秒)。每次时钟停止等待时更新时钟,并检查输入。