微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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" );
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐