服务开始然后停止?

时间:2013-04-28 10:14:31

标签: delphi delphi-xe3

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服务已启动然后停止。如果某些服务未被其他服务或程序使用,则会自动停止。”,服务终止。

  • 此来源有什么问题?

1 个答案:

答案 0 :(得分:8)

OnExecute的documentation说:

  

在与服务关联的线程启动时发生。

     

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

你的OnExecute没有循环。一旦该功能退出,服务就会停止。您需要执行文档描述的操作。循环或生成一个线程来处理服务请求。

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

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