Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-25964
uns
2004-01-01 22:36
2004.03.09
Контектное меню IE


1-25734
Islander
2004-02-26 00:59
2004.03.09
Как отловить отмену редактирования ноды?


14-25928
Домарощинер
2004-02-14 15:17
2004.03.09
Непонятные куки


1-25759
Ross
2004-02-26 16:38
2004.03.09
код ординарной кавычки


14-25938
iudjen
2004-02-11 21:43
2004.03.09
алгаритм переводчиков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский