Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
15-1254496978
Германн
2009-10-02 19:22
2009.11.29
Название контакта датчика


2-1255437491
alkul93
2009-10-13 16:38
2009.11.29
Сложная задача


3-1230112330
tomkat
2008-12-24 12:52
2009.11.29
Отчет FRP в записать таблицу ?


2-1255591239
Диман
2009-10-15 11:20
2009.11.29
Установка фокуса у компонента


2-1255523378
Сергей
2009-10-14 16:29
2009.11.29
Показать строку в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский