Windows 服務(Service Application)是在背景執行、不需使用者登入即可啟動的特殊程式,具備高權限且不易被工作管理員終止。Delphi 提供 TServiceApplication、TService、TServiceThread 完整封裝,大幅簡化服務開發。本文深入解析架構與關鍵實作要點。
| 類別 | 對應實體 | 說明 |
|---|---|---|
TServiceApplication | Service Application (EXE) | 專案 Application 物件,管理多個 Service |
TService | Service (單一服務) | 繼承 TDataModule,可放置非視覺元件,每個服務一執行緒 |
TServiceThread | 服務工作執行緒 | 內部執行緒,處理 OnExecute 邏輯 |
| 事件/方法 | 觸發時機 | 用途 |
|---|---|---|
OnCreate | 服務物件建立 | 初始化資源、資料庫連線 |
OnStart | 服務啟動 | 啟動監聽、排程、背景工作 |
OnExecute | 服務主執行緒運行 | **核心工作迴圈**(見下文) |
OnPause | 服務暫停 | 釋放非必要資源 |
OnContinue | 服務繼續 | 恢復資源 |
OnStop | 服務停止 | 清理、關閉連線、設 Terminated=True |
OnShutdown | 系統關機/服務應用程式結束 | 所有服務同時終止,最後機會存檔 |
服務必須同時處理**業務邏輯**與**外部控制請求**(停止/暫停)。錯誤做法:在 OnExecute 內執行阻塞式工作(如 Accept 監聽),導致無法響應停止請求。
procedure TMyService.ServiceExecute(Sender: TService);
var WorkThread: TThread;
begin
WorkThread := TWorkerThread.Create(False); // 啟動業務執行緒
try
while not Terminated do begin
ServiceThread.ProcessRequests(False); // 處理 SCM 請求(非阻塞)
Sleep(100); // 避免佔滿 CPU
end;
finally
WorkThread.Terminate;
WorkThread.WaitFor; // 等待業務執行緒結束
WorkThread.Free;
end;
end;
type TWorkerThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TWorkerThread.Execute;
begin
while not Terminated do begin
// 實際工作:Socket 監聽、定時任務、檔案監控等
// 使用非阻塞/可中斷的 API(如 TIdTCPServer、WaitForSingleObject)
Sleep(1000);
end;
end;
MyService.exe /installRun → Parameters → /debug 以應用程式模式啟動,可設中斷點OnExecute 內直接阻塞 → 服務無法停止,SCM 顯示「無回應」TForm、TButton) → 服務無桌面互動權限會失敗OnShutdown → 系統關機時資料未存盤新專案建議使用 TTopShelf、NSSM 或 .NET Core Worker Service / Go / Rust 等跨平台方案;維護舊 Delphi 專案時,上述模式仍是最佳實踐。