![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
почему не срабатывает таймер? [D7, WinXP]
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 - это функция.