2013-04-28 195 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