2013-04-28 158 views
-1
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张快照的服务。 无论如何,只要我启动服务,我收到消息“本地计算机上的服务1服务启动然后停止,某些服务如果没有被其他服务或程序使用,则会自动停止”,服务终止。服务启动,然后停止?

  • 这个来源有什么问题?

回答

8

documentation为OnExecute说:

时与该服务相关的线程启动时发生。

如果您不是在OnStart事件处理程序中产生一个新线程来处理个别服务请求 ,则这是您实现服务的地方。当OnExecute事件处理程序完成时,服务线程终止。大多数OnExecute事件处理程序都包含一个调用服务线程的ProcessRequests方法的循环,以便其他服务请求不会被锁定。

你的OnExecute不循环。一旦该功能退出,服务将停止。您将需要执行文档描述的内容。无论是循环,还是产生一个线程来处理服务请求。

请注意,您无法在服务中显示UI。所以你试图调用ShowMessage是行不通的。您需要使用适合于服务的日志记录机制。例如写入文件的文件。

正在计划作为计划任务的普通桌面进程中,您尝试执行的操作会更容易。我认为服务是你的问题的错误解决方案。

+0

伟大而且非常快速的答案David Heffernan谢谢! :) – 2013-04-28 10:31:00

相关问题