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

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

почему не срабатывает таймер? [D7, WinXP]


Страницы:   1 2 3

Dmitry_177 ©   (2007-10-29 13:44:00) 

Есть ini-файл, из него считывается время срабатывания таймеров(их несколько) но почему то не срабатывает таймер.. Приведу весь кусок кода:


program TimeServ;

uses
 Windows,
 Messages,
 Classes,
 IniFiles,
 SysUtils;

var
 AMessage: TMsg;
 hTimers: array of THandle;

procedure TimerAPCProc(lpArgToCompletionRoutine: PChar; dwTimerLowValue: DWORD; dwTimerHighValue: DWORD); stdcall;
begin
 MessageBox(0, '1', '1', 0);  // не срабатывает почему то..
end;

function InstallTimers: BOOL;
var
 Sections: TStrings;
 iTimer: integer;
 sysTime: SYSTEMTIME;
 fTime: FILETIME;
begin
   try
     Sections := TStringList.Create;

     with TIniFile.Create('TimeManager.ini') do
       try
         ReadSections(Sections);
         if Sections.Count > 0 then
           begin
             SetLength(hTimers, Sections.Count);
             for iTimer := 0 to Sections.Count - 1 do
               begin
                 hTimers[iTimer] := CreateWaitableTimer(nil, false, nil);
                 DateTimeToSystemTime(StrToDateTime(Sections[iTimer]), sysTime);  // запись происходит функцией DateTimeToStr, в переменной sysTime смотрел дата с временем правильно считывается..
                 SystemTimeToFileTime(sysTime, fTime);
                 LocalFileTimeToFileTime(fTime, fTime);
                 SetWaitableTimer(hTimers[iTimer], TLargeInteger(fTime), 0, @TimerAPCProc, nil, false);
               end;
           end;
       finally
         Free;
       end;

   finally
     Sections.Free;
   end;
end;

function UninstallTimers: BOOL;
var
 iTimer: integer;
begin
 for iTimer := 0 to Length(hTimers) - 1 do
   begin
     CancelWaitableTimer(hTimers[iTimer]);
     CloseHandle(hTimers[iTimer]);
   end;
 SetLength(hTimers, 0);
end;

begin
 InstallTimers;

 while GetMessage(AMessage, 0, 0, 0) do
   DispatchMessage(AMessage);

 UninstallTimers;
end.


Подскажите пожалуйста..


Германн   (2007-10-30 01:35:00) [41]


> а в lpArgToCompletionRoutine обрезанная строка, т.е. например
> исходная такая: 29.10.2007 21:33:00 а в процедуре она такая:
>  29.10.2007 21:33
>

"Гложат меня смутные сомнения. У Шпака - магнитофон, у посла - медальон"?
Очень смущают "конечные нули", на которых строка обрезается. Возможно я и не прав. Но...


Dmitry_177   (2007-10-29 22:30:00) [42]

я сделал в цикле SleepEx, вроде все работает =) только у меня еще один вопрос возник.. Мне нужно в процедуру TimerAPCProc передать значение Sections[iTimer], т.е. дату с временем в строке, делаю так:


SetWaitableTimer(hTimers[iTimer], TLargeInteger(fTime), 0, @TimerAPCProc, PChar(Sections[iTimer]), false);


а в lpArgToCompletionRoutine обрезанная строка, т.е. например исходная такая: 29.10.2007 21:33:00а в процедуре она такая: 29.10.2007 21:33


Leonid Troyanovsky   (2007-10-29 21:47:00) [43]


> Dmitry_177   (29.10.07 19:48) [11]

А то.

--
Regards, LVT.


Dmitry_177   (2007-10-29 19:48:00) [44]

само время срабатывания таймеров может быть записано в файле совсем не по порядку(т.е. не по возрастанию).. а если будет так что более позднее срабатывание считается первее чем более раннее?


Leonid Troyanovsky   (2007-10-29 19:42:00) [45]


> Dmitry_177   (29.10.07 18:08) [9]

> Прочитал повнимательней.. понял в чем дело.. а вот как сделать
> так чтобы все таймеры сработали?

Если таймеров не более 64, то все можно отслеживать
в одном потоке путем WaitForMultipleObjects|Ex.

Ну, а если более, то в нескольких потоках.

--
Regards, LVT.


Dmitry_177   (2007-10-29 18:08:00) [46]

Прочитал повнимательней.. понял в чем дело.. а вот как сделать так чтобы все таймеры сработали? Что-то я не придумаю никак.. Может SleepEx в бесконечный цикл поставить? Ведь программа вылетает при первом же срабатывании..


Сергей М.   (2007-10-29 14:40:00) [47]

А справку читать - дело не царское ?
Там же логика работы этой (и других упомянутых) ф-ции описана довольно четко.


Dmitry_177   (2007-10-29 14:38:00) [48]

эм.. сработало :) но только вот программа после срабатывания выключилась почему то.. что-то непойму почему, ведь бесконечное же ожидание..


Сергей М.   (2007-10-29 14:28:00) [49]

Ну хотя бы так.


Dmitry_177   (2007-10-29 14:27:00) [50]

т.е. вот так чтоли? =)

begin
 InstallTimers;

 SleepEx(INFINITE, True);

 UninstallTimers;
end.


Сергей М.   (2007-10-29 14:19:00) [51]


> Dmitry_177   (29.10.07 14:09) [2]


If you call SetWaitableTimer and the thread is not in an alertable state, the completion routine is canceled.

Нить находится в тревожном состоянии (alertable state) тольков момент исполнения ф-ции   WaitForSingleObject Ex, [Msg]WaitForMultipleObjects Ex, Read/WriteFile Ex, Sleep Ex.


Leonid Troyanovsky   (2007-10-29 14:10:00) [52]


> Dmitry_177   (29.10.07 13:44)  

>  while GetMessage(AMessage, 0, 0, 0) do
>    DispatchMessage(AMessage);

Это ж не user timer, попробуй, скажем, SleepEx(INFINITE, True).

--
Regards, LVT.


Dmitry_177   (2007-10-29 14:09:00) [53]

она возвращает true, т.е. все успешно..


Сергей М.   (2007-10-29 13:54:00) [54]

SetWaitableTimer - это функция.


Страницы:   1 2 3

Наверх

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