Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.031 c
15-1141903126
iamdanil
2006-03-09 14:18
2006.04.02
Java


15-1141541000
DarkHorror
2006-03-05 09:43
2006.04.02
Вычисление суммы строк матрицы...


15-1140694572
Praetor
2006-02-23 14:36
2006.04.02
Творческий вопрос(Нужна идея)


15-1141727942
КаПиБаРа
2006-03-07 13:39
2006.04.02
Какими стандартами Вы пользуетесь при разработе?


15-1142150131
Ega23
2006-03-12 10:55
2006.04.02
С Днём рождения! 12 марта