-
kuzulis © (17.03.08 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 © (17.03.08 10:24) [1]искал по поиску.. нашел это:
http://pda.delphimaster.net/?id=1193654690&n=5
но все-равно не понял .. :( -
kuzulis © (17.03.08 10:56) [2]т.е понял.... но мне не нужна еще одна задержка SleepEX !!!! (не упиралась)
мне нада например чтобы после SetWaitableTimer стали выполняться следующие операторы без задержки SleepEx .....
Мне костыль этот не нужен!!! -
APC выполняется в томже потоке, а он у тебя занят "основной" деятельностью... чтобы выполнилась очередь APC поток должен "уснуть" на блорирующем ожидании(WaitFor)/вводе/выводе, SleepEx и т.д. и т.п.
-
Сергей М. © (17.03.08 12:46) [4]
> мне не нужна еще одна задержка SleepEX
Не нужна - не порльзуй. Всех делов-то)
> мне нада например чтобы после SetWaitableTimer стали выполняться
> следующие операторы без задержки SleepEx
Оно так и будет, даже не сомневайся.
Тем более что никакими SleepEx в твоем коде даже не пахнет - ни до ни после SetWaitableTimer.
И вообще - твоя "Ямлять"-процедура должна иметь соглашение о вызове stdcall. -
Вообще какая цель? Нужен ли тебе этот Waitable и APC можно его на обычный таймер заменить
-
kuzulis © (17.03.08 10:56) [2]
SetWaitableTimer стали выполняться следующие операторы без задержки SleepEx
тагда отдельный паток :) -
Антон (04.10.08 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;
з.ы. Читайте Рихтера, там всё написанно