procedure TService1.ServiceExecute(Sender: TService);
var
FileName : string;
Strm : TMemoryStream;
i : integer;
h,m,s,ms : word;
begin
DecodeTime( now, h, m, s, ms );
if ( h = 13 ) AND ( m = 6 ) AND ( s = 0 ) then
begin
ShowMessage( 'entered' );
for i := 0 to 3 do
begin
DateTimeToString( FileName, 'yyyy-mm-dd-hh-nn-ss', now );
FileName := ExtractFilePath( Application.ExeName ) + FileName + '.jpg';
if not FileExists( FileName ) then
begin
try
Strm := TMemoryStream.Create;
try
IdHTTP_ := TIdHTTP.Create( nil );
try
IdHTTP_.Get( 'http://192.168.1.223/snapshot/view0.jpg', Strm );
finally
IdHTTP_.Free;
end;
Strm.Position := 0;
Strm.SaveToFile( FileName );
finally
Strm.Free;
end;
except
end;
end;
Sleep( 5000 );
end;
end;
end;
这是我的服务代码,它应该在特定时间内从IP摄像机拍摄4张快照。 无论如何,一旦我启动服务,我就会收到消息“本地计算机上的Service1服务已启动然后停止。如果某些服务未被其他服务或程序使用,则会自动停止。”,服务终止。
答案 0 :(得分:8)
OnExecute的documentation说:
在与服务关联的线程启动时发生。
如果您没有产生新线程来处理个人 在OnStart事件处理程序中的服务请求,这是您实现服务的位置。当OnExecute事件处理程序完成时,服务线程终止。大多数OnExecute事件处理程序都包含一个循环,该循环调用服务线程的ProcessRequests方法,以便其他服务请求不会被锁定。
你的OnExecute没有循环。一旦该功能退出,服务就会停止。您需要执行文档描述的操作。循环或生成一个线程来处理服务请求。
请注意,您无法在服务中显示UI。所以你试图调用ShowMessage是行不通的。您需要使用适合服务的日志记录机制。例如,写入文件的那个。
在计划作为计划任务安排的普通桌面进程中,您尝试执行的操作会更容易。我认为服务是解决问题的错误方法。