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

  • 这个来源有什么问题?
4

1 回答 1

8

OnExecute的文档说:

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

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

您的 OnExecute 不会循环。一旦该函数退出,服务就会停止。您将需要执行文档描述的操作。要么循环,要么产生一个线程来处理服务请求。

请注意,您不能在服务中显示 UI。因此,您尝试调用 ShowMessage 是行不通的。您需要使用适合服务的日志记录机制。例如写入文件的一个。

在计划为计划任务的普通桌面进程中,您尝试做的事情会容易得多。我认为服务是您问题的错误解决方案。

于 2013-04-28T10:20:11.980 回答