Конференция "WinAPI" » SetWaitableTimer не срабатывает
 
  • 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 .....
    Мне костыль этот не нужен!!!
  • Slym © (17.03.08 12:45) [3]
    APC выполняется в томже потоке, а он у тебя занят "основной" деятельностью... чтобы выполнилась очередь APC поток должен "уснуть" на блорирующем ожидании(WaitFor)/вводе/выводе, SleepEx и т.д. и т.п.
  • Сергей М. © (17.03.08 12:46) [4]

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


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


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


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

    И вообще - твоя "Ямлять"-процедура должна иметь соглашение о вызове stdcall.
  • Slym © (17.03.08 12:51) [5]
    Вообще какая цель? Нужен ли тебе этот Waitable и APC можно его на обычный таймер заменить
  • Slym © (17.03.08 12:52) [6]
    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;



    з.ы. Читайте Рихтера, там всё написанно
 
Конференция "WinAPI" » SetWaitableTimer не срабатывает
Есть новые Нет новых   [134435   +33][b:0][p:0.001]