Как заставить 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, 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.

4

Решение

Я не уверен, что не так с тем, что у вас здесь. Вы создали поток, который обновляет переменную-член 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" );
}
1

Другие решения

Боюсь, вы неправильно поняли, как работают системные таймеры и как их использовать — суть в том, что они автоматически работать в фоновом режиме, поэтому вам не нужно заниматься собственным управлением потоками.

Здесь приведены примеры и объяснения таймеров 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 для деталей.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector