Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.29;
Скачать: CL | DM;

Вниз

SetWaitableTimer не срабатывает   Найти похожие ветки 

 
kuzulis ©   (2008-03-17 10:21) [0]

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

:(

код
-----------------
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;
------------
помогите разобраться пожалуйста!!!


 
kuzulis ©   (2008-03-17 10:24) [1]

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

http://delphimaster.net/view/4-1193654690/

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


 
kuzulis ©   (2008-03-17 10:56) [2]

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

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


 
Slym ©   (2008-03-17 12:45) [3]

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


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


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


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


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


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

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


 
Slym ©   (2008-03-17 12:51) [5]

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


 
Slym ©   (2008-03-17 12:52) [6]

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

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


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

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;


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



Страницы: 1 вся ветка

Текущий архив: 2009.11.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
2-1255601111
xyz
2009-10-15 14:05
2009.11.29
где ошибка в запросе?


1-1226863029
demon
2008-11-16 22:17
2009.11.29
Как инсталировать шрифт в систему?


15-1249471484
pasha_golub
2009-08-05 15:24
2009.11.29
Игрушки


1-1226303661
dmitry_12_08_73
2008-11-10 10:54
2009.11.29
Определение места появления и размеров окна TColorDialog


15-1253465872
Кто б сомневался
2009-09-20 20:57
2009.11.29
Помогите перевести