c – 如何使Windows Timer在后台线程中运行

问题:如何在后台制作计时器?也就是说,创建计时器线程的线程在时钟滴答作响时仍然可以执行其他操作.

尝试:
– 使用_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,&Timer::tick,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);
...

注意:Iam使用Visual Studio 2008,而不是11,所以我没有C 11支持.

解决方法

我不确定你在这里有什么问题.你已经创建了一个永远更新成员变量计时器的线程,你主要使用它是一个紧/快循环,打印(大概)那个时间直到达到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" );
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...