![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с написанием Service'а [D7, WinXP]
patrick1968 © (2008-02-11 17:24:00)Появилась такая задача, решить которую надумал при помощи сервиса (до этого с этим не сталкивался), тема простая в случае появления определенного файла в определенном месте его необходимо перекинуть в др. место (наверное всё просто да только не работает) вот код:
unit Unload1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ActiveX, IniFiles,
DB, ADODB;
type
TUnload = class(TService)
OraConnection: TADOConnection;
procedure ServiceExecute(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
private
{ Private declarations }
public
QDesk : integer;
TempPath, arrPath, ConnectStringIn, ConnectStringOut : string;
arrDesk : array of string;
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
Unload: TUnload;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Unload.Controller(CtrlCode);
end;
function TUnload.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TUnload.ServiceExecute(Sender: TService);
begin
CoInitialize(nil);
while not terminated do begin
FileCreate(arrDesk[0] + 'cash001s.db');
if FileExists(arrDesk[0] + 'cash001.db')
then begin
FileCreate(arrDesk[0] + 'cash001s.db');
MoveFile(PChar(arrDesk[0] + 'cash001.db'),PChar(TempPath + 'cash001.db'));
end;
serviceThread.ProcessRequests(false);
CoUnInitialize;
end;
end;
procedure TUnload.ServiceStart(Sender: TService; var Started: Boolean);
var UnloadIni : TIniFile;
ind, idx : integer;
begin
CoInitialize(nil);
UnloadIni := TIniFile.Create('prUnload.ini');
if not FileExists('prUnload.ini')
then begin
UnloadIni.WriteInteger( 'MAIN', 'QDESK', 1);
UnloadIni.WriteString( 'MAIN', 'TEMPPATH', 'C:\');
UnloadIni.WriteString( 'MAIN', 'ARRPATH', '');
UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_IN', '');
UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_OUT', '');
QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
end
else begin
QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
end;
UnloadIni.Free;
try
OraConnection.ConnectionString := ConnectStringIn;
OraConnection.Connected := true;
except
end;
SetLength( arrDesk, QDesk);
ind := 0;
idx := 1;
arrDesk[ind] := '';
while (idx <= Length(arrPath)) do begin
if arrPath[idx] <> ','
then arrDesk[ind] := arrDesk[ind] + arrPath[idx]
else begin
inc(ind);
arrDesk[ind] := '';
end;
inc(idx);
end;
CoUnInitialize;
end;
в стартовой процедуре определил переменные, которые нужны при Execute'е, только там она их не видит почему-то, помогите разобраться, заранее благодарен.
Сергей М. (2008-02-12 15:35:00) [1]
> в случае появления определенного файла в определенном месте
> его необходимо перекинуть в др. место
Логика, ведущая в тупик.
ketmar (2008-02-12 15:33:00) [2]>[33] Palladin © (2008-02-12 15:27:00)
вообще-то жрачки. %-)
---
Understanding is not required. Only obedience.
Leonid Troyanovsky (2008-02-12 15:28:00) [3]
> Slym © (12.02.08 13:35) [25]
> Откуда эти мертвяки лезут?
Из вредных советов.
http://podgoretsky.com/DM/BadTips.html#bt-04
--
Regards, LVT.
Palladin (2008-02-12 15:27:00) [4]
> [32] ketmar © (12.02.08 15:11)
w3k ждал? :)
ketmar (2008-02-12 15:11:00) [5]>[31] Dennis I. Komarov © (2008-02-12 15:09:00)
>Злой ты какой-то сегодня :)
не спал ещё. %-)
---
Understanding is not required. Only obedience.
Dennis I. Komarov (2008-02-12 15:09:00) [6]> [29] ketmar © (12.02.08 14:02)
Злой ты какой-то сегодня :)
> [27] patrick1968 © (12.02.08 13:47)
Переходим к убитым енотам: 50
Palladin (2008-02-12 14:10:00) [7]
> [27] patrick1968 © (12.02.08 13:47)
та все эти выкрутасы ты тупо скопировал и необоснованно использовал, непонимая чего к чему, а по ссылкам они очень даже обосновано использованы...
ketmar (2008-02-12 14:02:00) [8]>[23] Palladin © (2008-02-12 13:31:00)
как это «где-то»? очен даже известно, где. некий неприкасаемый это популяризировал, чтоб ему ни дна, ни покрышки.
---
Understanding is not required. Only obedience.
Slym (2008-02-12 13:56:00) [9]
var
UnloadIni : TIniFile;
begin
UnloadIni := TIniFile.Create('prUnload.ini');
try
if not FileExists(UnloadIni.FileName) then
begin
UnloadIni.WriteInteger( 'MAIN', 'QDESK', 1);
UnloadIni.WriteString( 'MAIN', 'TEMPPATH', 'C:\');
UnloadIni.WriteString( 'MAIN', 'ARRPATH', '');
UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_IN', '');
UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_OUT', '');
end;
QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
finally
UnloadIni.Free;
end;
patrick1968 (2008-02-12 13:47:00) [10]Да все эти выкрутасы с этих ссылок и взял, из примеров
Slym (2008-02-12 13:37:00) [11]и OraConnection у тебя для понта или реально гдето используется?
Slym (2008-02-12 13:35:00) [12]
while not Terminated do
begin
Synchronize(DoWork);
Sleep(1000);
end;
Откуда эти мертвяки лезут? А выкрутасы с ini на елку вместо гирлянд весить...
сделай модуть (unit) со своим потоком... отладь его в обычном приложении... а уж потом его к сервису приленкуешь
Palladin (2008-02-12 13:33:00) [13]
> Self.Priority := tpHighest;
а за это вообще пожизненный эцих с гвоздями
Palladin (2008-02-12 13:31:00) [14]
> procedure TMainThread.Execute;
> begin
> while not Terminated do
> begin
> Synchronize(DoWork);
> Sleep(1000);
> end;
> end;
ты опять бредишь?
и по ссылке мы не ходили по моей
и гдето про synchronize узнали
и решили что это круто
и заюзали
Сергей М. (2008-02-12 13:31:00) [15]
> переменные которые фигурируют в конструкторе
> в процедуре DoWork
Какой такой "конструктор" ? Какая DoWork ?!
Ни того ни другого в приведенном коде и в помине нет
patrick1968 (2008-02-12 13:28:00) [16]Так сделал, служба стартует нормально только переменные которые фигурируют в конструкторе (например arrDesk[0] которая на том этапе равна 'D:\CASSA\') в процедуре DoWork равна '' наверное есть какая-то хитрость?
Dennis I. Komarov (2008-02-12 13:20:00) [17]> procedure TUnload.ServiceExecute(Sender: TService);
> begin
> MainThread := TMainThread.Create;
> end;
>
> end.
>
> в итоге при старте службы пишет что служба была запущена
> а затем остановлена т.к. нечего делать. Может есть какой
> пример по написанию службы при помощи создания доп потоков?
После того, как служба создала поток, ее действие закончилось - она и остановилася
написать службу при помощи создания доп. потоков - низя :)
Сперва разберись с ними по отдельности, а потом склеишь.
Palladin (2008-02-12 13:06:00) [18]да забудь ты про SeviceExucte!
поток стартуй на ServiceStart
поток останавливай на ServiceStop
patrick1968 (2008-02-12 13:04:00) [19]Попытался через дополнительный поток
вот код
unit Unload1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ActiveX, IniFiles,
DB, ADODB;
type
TMainThread = class(TThread)
private
public
QDesk : integer;
TempPath, arrPath, ConnectStringIn, ConnectStringOut : string;
arrDesk : array of string;
OraConnection: TADOConnection;
constructor Create;
protected
procedure DoWork;
procedure Execute; override;
end;
TUnload = class(TService)
OraConnection: TADOConnection;
procedure ServiceExecute(Sender: TService);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
MainThread : TMainThread;
Unload: TUnload;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Unload.Controller(CtrlCode);
end;
function TUnload.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
constructor TMainThread.Create;
var UnloadIni : TIniFile;
ind, idx : integer;
begin
inherited Create(True);
UnloadIni := TIniFile.Create('prUnload.ini');
if not FileExists('prUnload.ini')
then begin
UnloadIni.WriteInteger( 'MAIN', 'QDESK', 1);
UnloadIni.WriteString( 'MAIN', 'TEMPPATH', 'C:\');
UnloadIni.WriteString( 'MAIN', 'ARRPATH', '');
UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_IN', '');
UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_OUT', '');
QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
end
else begin
QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
end;
UnloadIni.Free;
try
OraConnection.ConnectionString := ConnectStringIn;
OraConnection.Connected := true;
except
end;
SetLength( arrDesk, QDesk);
ind := 0;
idx := 1;
arrDesk[ind] := '';
while (idx <= Length(arrPath)) do begin
if arrPath[idx] <> ','
then arrDesk[ind] := arrDesk[ind] + arrPath[idx]
else begin
inc(ind);
arrDesk[ind] := '';
end;
inc(idx);
end;
Self.Priority := tpHighest;
Resume;
end;
procedure TMainThread.DoWork;
begin
if FileExists(arrDesk[0] + 'cash001.db')
then begin
FileCreate(arrDesk[0] + 'cash001s.db');
end;
end;
procedure TMainThread.Execute;
begin
while not Terminated do
begin
Synchronize(DoWork);
Sleep(1000);
end;
end;
procedure TUnload.ServiceExecute(Sender: TService);
begin
MainThread := TMainThread.Create;
end;
end.
в итоге при старте службы пишет что служба была запущена а затем остановлена т.к. нечего делать. Может есть какой пример по написанию службы при помощи создания доп потоков?
ANB (2008-02-12 12:21:00) [20]
> работает как надо
Начни писать длинннный файл. А пока он пишется - нажми кнопку. Удивись.