Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.09;
Скачать: CL | DM;

Вниз

запуск процедуры в определенное время   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
1-25733
Rayslava
2004-02-26 17:48
2004.03.09
RichEdit из Dll


7-25956
Rentgen
2003-12-20 22:28
2004.03.09
PreView?


14-25853
Petr V. Abramov
2004-02-14 21:41
2004.03.09
Soft Must Be Free!


4-25964
uns
2004-01-01 22:36
2004.03.09
Контектное меню IE


14-25936
Soft
2004-02-15 00:19
2004.03.09
Голубая кровь!!!