【问题标题】:Service started and then stopped?服务启动然后停止?
【发布时间】:2013-04-28 10:14:31
【问题描述】:
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 服务启动然后停止。如果某些服务没有被其他服务或程序使用,它们会自动停止。”,并且服务终止。

  • 这个来源有什么问题?

【问题讨论】:

    标签: delphi delphi-xe3


    【解决方案1】:

    OnExecute 的 documentation 表示:

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

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

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

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

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

    【讨论】:

    • 非常快速的回答 David Heffernan 谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多