Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Вниззапуск процедуры в определенное время Найти похожие ветки
← →
NPR2 (2004-02-25 13:28) [0]Добрый день! Имею программу, постоянно работающую. Неоходимо каждый день, в
определенное время запускать процедуру из это программы.
Заранее спасибо
← →
KosilkA (2004-02-25 13:31) [1]использовать ttimer и getlocaltime
← →
Mur_r (2004-02-25 13:31) [2]пишешь консоль-вечный резидент, туда проверку даты-времени и запуск программы. Может как-нить еще можно сделать, не знаю
← →
Anatoly Podgoretsky (2004-02-25 13:32) [3]А с чем именно проблема?
Если про возможность, то да можно.
← →
Mur_r (2004-02-25 13:32) [4]ой, ворона:) тогда все еще проще, вечного резидента не надо
← →
Mur_r (2004-02-25 13:34) [5]отдельным потоком ставишь проверку времени, например, с помощью Now и сверку его с заданным временем. Если совпали, то вызываешь процедуру
← →
Anatoly Podgoretsky (2004-02-25 13:37) [6]Mur_r © (25.02.04 13:34) [5]
Трудно ожидать совпадения, это если очень повезет.
← →
Mur_r (2004-02-25 13:39) [7]Если организовать проверку с точностью до секунды или с приближением? да уверена, что пройдет. Запоминаем предыдущее время, если оно ближе к нужному, или текущее совпадает с нужным, то запускаем
← →
Mur_r (2004-02-25 13:40) [8]Если вспомнить, что она идет отдельным потоком, то все пройдет ок.
← →
Defunct (2004-02-25 13:44) [9]Если организовать проверку с точностью до секунды или с приближением? да уверена, что пройдет. Запоминаем предыдущее время, если оно ближе к нужному, или текущее совпадает с нужным, то запускаем
Храним флажек - запускалась процедупа сегодня или нет.
If Not запускалась And (время больше требуемого) Then
Begin
запускалась := True;
запустить.
End;
Обнулять флажен при смене даты.
← →
NPR2 (2004-02-25 13:45) [10]Спасибо! Я не нашла getlocaltime, что это. А про потоки, если можно по-подробнее. Я только учусь работать с ними.
← →
Defunct (2004-02-25 13:47) [11]Defunct © (25.02.04 13:44) [9]
LOL веселые очепятки...
;)
Хранить флажек - запускалась процедура сегодня или нет.
Сбрасывать флажек при смене даты.
← →
Defunct (2004-02-25 14:13) [12]Если меня сейчас не закидают камнями, предложу готовое решение с отдельным потоком:
unit TimeCheck;
interface
uses
Classes, Windows;
type
TJob = Procedure Of Object;
TMyThread = class(TThread)
private
FAction : TJob;
FExecuted : Boolean;
FDate : Integer;
{ Private declarations }
Protected
procedure Execute; override;
Public
Constructor Create(Job:TJob);
end;
implementation
Constructor TMyThread.Create;
Var ST:TSystemTime;
Begin
GetLocalTime(ST);
FDate := ST.wDay;
FAction := Job;
FExecuted := False;
FreeOnTerminate := True;
Priority := tpLowest;
Inherited Create(False);
End;
procedure TMyThread.Execute;
Var St:TSystemTime;
begin
Repeat
GetLocalTime(ST);
If (ST.wHour = 15) And (ST.wMinute > 00) Then // В 15.00
If Not FExecuted and Assigned(FAction) Then
// Если не запускали и есть что запускать
Begin
FExecuted := True;
FAction;
End;
Until False;
end;
end.
Где-то в программе, например, при создании формы пишете:
procedure TForm1.Form1Create(Sender: TObject);
begin
With TFTPThread.Create(StartITAT1500); // Имя процедуры без параметров которую нужно запустить в 15.00
...
...
end;
procedure TForm1.StartItAT1500;
Begin
....
End;
← →
Defunct (2004-02-25 14:19) [13]да что ж такое опять опечатка.. при копировании..
procedure TForm1.Form1Create(Sender: TObject);
begin
With TMyThread.Create(StartITAT1500); // Имя процедуры без параметров которую нужно запустить в 15.00
...
...
end;
Да и в модуле TimeCheck в цикле процедуры Execute добавте проверку даты:
procedure TMyThread.Execute;
...
...
...
FAction;
End;
If ST.wDay<>FDate Then
Begin
FExecuted := False;
FDate := ST.wDay;
End; Until False;
end;
← →
Тимохов (2004-02-25 14:23) [14]
> Defunct © (25.02.04 14:13) [12]
В общем случае решение спорное.
А если StartItAT150 будет обращаться к компонентам VCL?
Автор не дал комментариев о том, что должна делать эта процедура...
← →
Anatoly Podgoretsky (2004-02-25 14:38) [15]Не потоков, ни флажков не надо делать, надо простно проверка не на равенство, а на текущее время (вместе с датой конечно) >= время срабатывания и при выполнении условия устанавливать время следующего срабатывания. Так построен и штатный планировщик, вот этот алгоритм будет работать без ошибки.
← →
Defunct (2004-02-25 14:40) [16]> В общем случае решение спорное.
А если StartItAT150 будет обращаться к компонентам VCL?
Автор не дал комментариев о том, что должна делать эта процедура...
Так или иначе обращение пусть даже к VCL компонентам, будет однократным. Сомневаюсь что это привед к сбою. Хотя, для того чтобы не было спорных моментов, добавляем:
TMyThread = class(TThead)
Private
...
Procedure DoTheJob;
Protected
procedure Execute; override;
Public
...
End;
Procedure TMyThread.DoTheJob;
Begin
If Assigned(FAction) Then FAction;
End;
// Модифицируем Execute
procedure TMyThread.Execute;
Var St:TSystemTime;
begin
Repeat
GetLocalTime(ST);
If (ST.wHour = 15) And (ST.wMinute > 00) Then // В 15.00
If Not FExecuted Then
// Если не запускали
Begin
FExecuted := True;
Synchronize(DoTheJob);
End;
If ST.wDay<>FDate Then
Begin
FExecuted := False;
FDate := ST.wDay;
End;
Until False;
end;
← →
mip (2004-02-25 14:49) [17]Народ, а не проще поставить на форму компонент из RxLib RxClock и по срабатыванию OnAlarm делать чё вам там вздумаеться, и нечего ломать голову по поводу потоков!
← →
Тимохов (2004-02-25 14:58) [18]
> Defunct © (25.02.04 14:40) [16]
Можете же ведь, если захотите.
Единственно, что рассуждения типа
> Так или иначе обращение пусть даже к VCL компонентам, будет
> однократным. Сомневаюсь что это привед к сбою.
являются лишними. Сомневаться не нужно - надо просто создавать корректный код и не сомневаться.
← →
NPR2 (2004-02-26 04:44) [19]Большое спасибо, я нашла решение!!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c