Текущий архив: 2006.04.02;
Скачать: CL | DM;
ВнизПомогите с сервисом Найти похожие ветки
← →
serg111111 (2006-03-16 10:24) [0]Привет умники и умницы :).
Создал сервис как File->New->Other->ServiceApplication, но незнаю как написать обработчик, который проверял бы заланное время с текущим и вслучае совпадения выполнял определенную операцию!
← →
Сергей М. © (2006-03-16 10:44) [1]TMyService = class(TService)
..
private
Timer: TTimer;
procedure TimerProc(Sender: TObject);
..
end;
procedure TMyService.MyServiceStart(..); //обработчик события OnStart()
begin
FTimer := TTimer.Create(nil);
FTimer.Interval := 1000;
FTimer.OnTimer := TimerProc;
FTimer.Enabled := True;
Started := True;
end;
procedure TMyService.MyServiceStop(..); //обработчик события OnStop()
begin
FTimer.Free;
Stopped := True;
end;
procedure TMyService.TimerProc(Sender: TObject); //обработчик события OnTimer объекта TTimer
begin
.. читаем тек.сист.время
.. сравниваем с заданным
.. и по результатам сравнения выполняем ту самую "определенную операцию"
end;
← →
serg111111 (2006-03-16 10:49) [2]Спасибо!!!!!!!!!!!!!!
← →
serg111111 (2006-03-16 11:04) [3]Что писать в скобочках в процедурах и какого типа Ftimer
← →
Сергей М. © (2006-03-16 11:10) [4]
> Что писать в скобочках в процедурах
Можешь вообще ничего там не писать - компилятору достаточно корректной декларации этих методов в декларации класса TMyService.
Либо доверься Инспектору Объектов, который при назначении обработчиков сам свормирует все неоходимые "заготовки" методов-обработчиков.
> какого типа Ftimer
private
FTimer: TTimer; //тут первая F была пропущена, мог бы и сам догадаться дописать ее
← →
serg111111 (2006-03-16 11:41) [5]Сергей помоги, как вызвать событие ONstart
← →
Сергей М. © (2006-03-16 11:48) [6]
> как вызвать событие ONstart
Никак.
Событие не вызывается, оно возбуждается кем/чем-либо.
В данном случае при старте сервиса (например, средствами стандартной консоли управления сервисами) как раз и будет возбуждено это событие, в рез-те чего будет вызван метод MyServiceStart, назначенный тобой в кач-ве метода-обработчика этого события.
Со стопом сервиса все точно так же выглядит.
← →
serg111111 (2006-03-16 11:53) [7]>>MyServiceStart, назначенный тобой в кач-ве метода-обработчика этого события.
А как это сделать?
← →
Сергей М. © (2006-03-16 12:10) [8]
> serg111111 (16.03.06 11:53) [7]
Ну как ты обычно назначаешь обработчики ? Скажем, обработчик OnCreate какой-либо формы в обычном приложении ? Точно так же и здесь, только вместо формы здесь выступает модуль данных сервиса, созданный сервис-экспертом при создании "заготовки" проекта сервиса ..
Выделяешь мышом окно этого модуля (класс TService есть прямой наследник класса TDataModule, а класс твоего сервиса TMyService как прямой наследник класса TService при этом является непрямым наследником класса TDataModule), переходишь в окно Инспектора Объектов, в закладке Events видишь там кучу событий, в числе которых есть OnStart и OnStop, делаешь мышом даблклик на каждом из них - в рез-те в юните твоего сервиса появляются декларации соотв.методов и корректные "заготовки" их реализации ...
← →
serg111111 (2006-03-16 12:15) [9]Т.е что-то в виде эго-
procedure Tmyservice.ServiceStart(Sender: TService; var Started: Boolean);
begin
myServiceStart;
end;
procedure Tmyservice.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
MyServiceStop;
end;
← →
Сергей М. © (2006-03-16 12:19) [10]
> Т.е что-то в виде эго
кто такой "эго" ?)
procedure Tmyservice.ServiceStart(Sender: TService; var Started: Boolean);
begin
..прямо здесь реализуй вышеупомянутую работу с таймером
end
procedure Tmyservice.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
.. и здесь тоже самое
end;
← →
serg111111 (2006-03-16 12:30) [11]Но он почему-то не делает то, что я его прошу!
вот весь код сервиса!
unit myservis;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls;
type
Tmyservice = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
ftimer:ttimer;
procedure TimerProc(Sender: TObject);
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
myservice: Tmyservice;
var f:textfile;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
myservice.Controller(CtrlCode);
end;
function Tmyservice.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure Tmyservice.TimerProc(Sender: TObject);
begin
assignfile(f,"log.txt");
append(f);
if datetostr(date)="16.03.2006" then
writeln(f,"good");
closefile(f);
end;
procedure Tmyservice.ServiceStart(Sender: TService; var Started: Boolean);
begin
FTimer := TTimer.Create(nil);
FTimer.Interval := 1000;
FTimer.OnTimer := TimerProc;
FTimer.Enabled := True;
Started := True;
end;
procedure Tmyservice.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
FTimer.Free;
Stopped := True;
end;
end.
← →
Сергей М. © (2006-03-16 13:04) [12]
> он почему-то не делает то, что я его прошу
Сервис-то инсталлировал как положено ?
← →
serg111111 (2006-03-16 13:46) [13]myservice.exe /install
← →
Сергей М. © (2006-03-16 13:54) [14]Ну и ?
Что показывает Service Manager ? Сервис стартует успешно ?
← →
serg111111 (2006-03-16 14:07) [15]Пишу ->myservice.exe /install
Выходит сообщение->SERVICE INSTALLED SUCCESSFULLY
← →
Сергей М. © (2006-03-16 14:10) [16]
> serg111111 (16.03.06 14:07) [15]
Это ты его только инсталлировал.
А стартовал-то ты его как ?
← →
serg111111 (2006-03-16 14:12) [17]запустил службу Мой компьютер->Управление->Службы и нажал на кнопочку Play
← →
Сергей М. © (2006-03-16 14:17) [18]
> нажал на кнопочку Play
Так ..
И что ты увидел при этом ?
На основании чего ты посчитал что твой сервис успешно стартовал ?
← →
serg111111 (2006-03-16 14:20) [19]В состоянии написано, что он работает!
← →
Сергей М. © (2006-03-16 14:34) [20]Ну а раз работает, то средствами встр.отладчика лови брейкпойнт
procedure TMyService.TimerProc(Sender: TObject);
begin //<-- здесь
..
а дальше средствами того же пошагово проверяй, что там у тебя не слава богу ..
По поводу особенностей трассировки/отладки Делфи-сервисов читай станд.справку на тему "Debugging service applications"/
Да, и не забудь (важно !) установить для своего сервиса опцию взаимодействия с раб.столом.
← →
serg111111 (2006-03-16 14:37) [21]->Да, и не забудь (важно !) установить для своего сервиса опцию взаимодействия с раб.столом.
->КАк?
← →
Сергей М. © (2006-03-16 14:43) [22]
> КАк?
Каком кверху.
Свойства сервиса в том самом сервис-менеджере разглядывал хоть раз ?
← →
serg111111 (2006-03-16 15:38) [23]А зачем связывать сервис с рабочим сталом?
← →
Сергей М. © (2006-03-16 15:46) [24]За надом.
Иначе будут проблемы (их ты, вероятно. уже имеешь) с оконными сообщениями.
TTimer как раз и использует этот механизм.
Страницы: 1 вся ветка
Текущий архив: 2006.04.02;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.044 c