问题:如何在后台制作计时器?也就是说,创建计时器线程的线程在时钟滴答作响时仍然可以执行其他操作.
尝试:
– 使用_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); ...
解决方法
我不确定你在这里有什么问题.你已经创建了一个永远更新成员变量计时器的线程,你主要使用它是一个紧/快循环,打印(大概)那个时间直到达到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" ); }