加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:02:16 所属栏目:百科 来源:网络整理
导读:问题:如何在后台制作计时器?也就是说,创建计时器线程的线程在时钟滴答作响时仍然可以执行其他操作. 尝试: – 使用_beginthreadex() – 它似乎有竞争条件 class Timer{ ... static unsigned __stdcall tick(void *param){ while(1){ Timer::timer++; Sleep
问题:如何在后台制作计时器?也就是说,创建计时器线程的线程在时钟滴答作响时仍然可以执行其他操作.

尝试:
– 使用_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 %sn",inputRecord.Event.KeyEvent.uChar.AsciiChar,inputRecord.Event.KeyEvent.bKeyDown ? "down" : "up" );
            }
        }
    }
    printf( "update clockn" );
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读