Но все эти таймеры будут работать из 2 потоков. тоесть программа->поток>таймера. И на скоко точно в таком случаии они будут срабатывать?
И еще вопрос, вот если на середине выполнения одной функ. Таймер вызывает эту же функ. то эта функ. прервет работу свою то: она заново выполниться, или у таймера будет эта же функ. но даные сначало сохраняться на предудущем выполнении функ. а потом токо она сначало выполниться. и после этого дальше продолжыт работу функ. с того места где ее прервали?
Как сделать так чтоб: пока таймер вызвал одну функ. эту же функ. не мог вызвать другой таймер. а после того как первый раз функ. вызваная первым таймером закончит роботу, ее сразу вызывает второй таймер.
XshStasX Мда... Чтобы это расшифровать, надо приглашать специалистов по криптоанализу. Таймер не вызывает функцию. Он добавляет её в очередь APC. Соответственно исполнение функции при срабатывании таймера не прервётся, если функция, вызванная в результате предыдущего срабатывания, ещё не завершила работу. Очередной вызов функции будет выполнен по окончанию работы функции, выполняющейся по предыдущему вызову. Если функция работает дольше интервала срабатывания таймера, то это, вероятно, в какой-то момент приведёт к переполнению очереди APC. Добавить в функцию любой синхронизирующий объект: от тривиальной глобальной переменной до критической секции. Зависит от конкретных целей.
Как сделать так чтоб не ожидать пока произойдет событие в таком цыкле: Код (Text): repeat WaitForSingleObject(H,INFINITE); MessageBox(0,'','',0); until false; а чтоб сама функ. визвалась которую указываешь при создании таймера делал я это так: Код (Text): function ACP(p:Pointer;d1,d2:DWORD):bool;stdcall; begin TForm(p).Color:=clred; MessageBox(0,'','',0); end; procedure TForm1.Button1Click(Sender: TObject); var k:Int64; begin h:=CreateWaitableTimer(nil,false,nil); k:=-1000; SetWaitableTimer(h,k,2000,@ACP,Self,true); end; но функция ACP не вызываеться, в чем я тут ошибся? а то при помощи WaitForSingleObject не очень удобно
XshStasX Поток, выполняющий APC, должен находиться в сторожевом состоянии. Т.е. Вы должны в потоке выполнить SetWaitableTimer, а потом перевести его в сторожевое состояние: Код (Text): repeat SleepEx(INFINITE, true); until false; Тогда указанная в SetWaitableTimer функция по таймеру будет добавляться в очередь APC и тут же выполняться, т.к. поток сразу находится в сторожевом состоянии (второй параметр при вызове SleepEx выставлен в true).
Всем привет! У меня такая проблема: Мне нужно добиться задержки в 100 мксек. Использую CreateWaitableTimer, SetWaitableTimer, WaitForSingleObject. Но при проверке GetTickCount 100 периодов повторения у меня показывает 94..140 мсек. , хотя пишут, что SetWaitableTimer должен работать от 200 нсек. Почему так, и как добиться нужной задержки? Использую VC++ 6 Создаю проект как MFC диалог Код (Text): UINT iCnt = 0; CString str; int iTime = -GetTickCount(); HANDLE hTimer; hTimer = CreateWaitableTimer(NULL, FALSE, NULL); LARGE_INTEGER delay; delay.QuadPart = -100L; //100000 = 1 msec for(int i = 0; i<100; i++) { SetWaitableTimer(hTimer, &delay, 0, 0, NULL, 1); // Установка Задержки WaitForSingleObject(hTimer, INFINITE); // Ожидаем завершения CancelWaitableTimer(hTimer); } CloseHandle(hTimer); iTime += GetTickCount(); str.Format("%d", iTime); AfxMessageBox(str); // Выводим сообщение
Squirrel Вместо того, чтобы встревать с одним вопросом в чужие темы, лучше создать свою Ответы в пред.теме читал ? Или забыл, где задавал вопрос ?