Вопрос: Как сделать таймер на фоне? Это поток, который создает поток таймера, который может делать что-то еще, пока тикают часы.
Попытка:
-Используя _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);
...
ПРИМЕЧАНИЕ: я использую Visual Studio 2008, а не 11, поэтому у меня нет поддержки C ++ 11.
Я не уверен, что не так с тем, что у вас здесь. Вы создали поток, который обновляет переменную-член 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" );
}
Боюсь, вы неправильно поняли, как работают системные таймеры и как их использовать — суть в том, что они автоматически работать в фоновом режиме, поэтому вам не нужно заниматься собственным управлением потоками.
Здесь приведены примеры и объяснения таймеров Windows в целом, и вы можете использовать их, если вы пытаетесь свернуть свои собственные Timer
учебный класс: Таймеры Учебник
Это Timer
класс, который поставляется с Windows .NET, с примером кода внизу: Таймер Класс
Отредактировано, чтобы добавить:
Вот версия примера таймера Win32 (с турориальной страницы), адаптированная для приложения без MFC:
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);
}
Увидеть MSDN: функции таймера для деталей.
Тогда внутри вашей оконной процедуры вы получите WM_TIMER
сообщение и ответьте как хотите.
В качестве альтернативы, таймер может вызывать пользовательскую процедуру. Увидеть Функция SetTimer для деталей.