Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SetWaitableTimer не срабатывает


kuzulis ©   (2008-03-17 10:21:00) 

Доброго времени суток..
У меня почему - то при истечении времени не вызывается процедура обработки в таймере....

:(

код
-----------------
var
 term :BOOL;
 delay   :int64;
 tid:dword;
 hTimer  :THandle;

procedure TimerAPCProc(
  lpArgToCompletionRoutine: Pointer;  // данные
  dwTimerLowValue: DWORD;   // младшие 32 разряда значения таймера
  dwTimerHighValue: DWORD  // старшие 32 разряда значения таймера
);
begin
 MessageBox(0,'Ямлять сработал','',MB_OK);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   delay:=-20000000;
   hTimer:=CreateWaitableTimer(nil,false,nil);
   if SetWaitableTimer(hTimer,delay,0,@TimerAPCProc,nil,false) then
     MessageBox(0,'SetWaitableTimer OK','',MB_OK);
end;
------------
помогите разобраться пожалуйста!!!


Антон   (2008-10-04 16:12:00) [1]

TimerAPCProc вызывается из того потока, который обратился к SetWaitableTimer в момент срабаты вания таймера, — но только если вызывающий поток находится в "тревожном" (aler table) состоянии, т. e. ожидает этого в вызове одной из функций SleepEx, WaitForSingle ObjectEx, WaitForMultipleObjectsEx,MsgWaitForMultipleObjectsEx или SignalObjectAndWait Если же поток этого не ожидает в любой из перечисленных функций, система не поставит в очередь АРС-функцию таймера. Тем самым система не даст АРС-очереди потока переполниться уведомлениями от таймера, которые могли бы впустую израсходовать колоссальный объем памяти.
Если в момент срабатывания таймера Ваш поток находится в одной из перечис ленных ранее функций, система заставляет его вызвать процедуру обратного вызова Первый ее параметр совпадает с параметром pvArgToCompletionRoutine, передаваемым в функцию SetWaitableTimer, Это позволяет передавать в TimerAPCRoutine какие-либо данные (обычно указатель на определенную Вами структуру) Остальные два парамет ра, dwTimerLowValue и dwTimerHighValue, задают время срабатывания таймера.

я сделал так.... у меня работает

procedure TimerAPCProc(lpArgToCompletionRoutine: Pointer;dwTimerLowValue: DWORD;
dwTimerHighValue: DWORD); stdcall;
begin
MessageBox(0,'Ямлять сработал','',MB_OK);
end;

procedure ThProc(p:Pointer);stdcall;
var
 WTimer:TWaitableTimer;//Класс для передачи параметров в поток
begin
 WTimer:=TWaitableTimer(P);
 with WTimer do
 begin
   SetWaitableTimer(FHandle,FLongTime,FPeriod,@TimerAPCProc,p, False);
   while (FHandle<>0) and (not Application.Terminated) and (not FTerminated) do
   begin
       SleepEx(INFINITE,True);
   end;
 end;
end;

procedure TWaitableTimer.Start;
var
 ThreadID: DWORD;
begin
 HThread:=CreateThread(nil,256,@ThProc,Self,0,ThreadID);
end;


з.ы. Читайте Рихтера, там всё написанно


Slym   (2008-03-17 12:52:00) [2]

kuzulis ©   (17.03.08 10:56) [2]
SetWaitableTimer стали выполняться следующие операторы без задержки SleepEx

тагда отдельный паток :)


Slym   (2008-03-17 12:51:00) [3]

Вообще какая цель? Нужен ли тебе этот Waitable и APC можно его на обычный таймер заменить


Сергей М.   (2008-03-17 12:46:00) [4]


> мне не нужна еще одна задержка SleepEX


Не нужна - не порльзуй. Всех делов-то)


> мне нада например чтобы после SetWaitableTimer стали выполняться
> следующие операторы без задержки SleepEx


Оно так и будет, даже не сомневайся.
Тем более что никакими SleepEx в твоем коде даже не пахнет - ни до ни после SetWaitableTimer.

И вообще - твоя "Ямлять"-процедура должна иметь соглашение о вызове stdcall.


Slym   (2008-03-17 12:45:00) [5]

APC выполняется в томже потоке, а он у тебя занят "основной" деятельностью... чтобы выполнилась очередь APC поток должен "уснуть" на блорирующем ожидании(WaitFor)/вводе/выводе, SleepEx и т.д. и т.п.


kuzulis   (2008-03-17 10:56:00) [6]

т.е понял.... но мне не нужна еще одна задержка SleepEX !!!! (не упиралась)

мне нада например чтобы после SetWaitableTimer стали выполняться следующие операторы без задержки SleepEx .....
Мне костыль этот не нужен!!!


kuzulis   (2008-03-17 10:24:00) [7]

искал по поиску.. нашел это:

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1193654690&n=5

но все-равно не понял .. :(


Наверх

Титульная страница Поиск, карта сайта Написать письмо