gpt4 book ai didi

windows - 服务 OnExecute 失败,生成的线程未执行

转载 作者:可可西里 更新时间:2023-11-01 11:38:22 26 4
gpt4 key购买 nike

首先开始在 Delphi 7 中启动我自己的服务。遵循文档并使服务生成一个自定义线程,该线程会发出蜂鸣声并记录日志。只有它没有。最后一次尝试是在 OnExecute 事件过程中放置​​相同的蜂鸣声和日志代码,但是当我启动该服务时,我收到一个 Windows 对话框,提示它已启动然后再次停止。

this code 中应该有一些明显的东西被我忽略了.

你能看看吗?我还将接受指向简单、有效、可下载的服务示例项目的链接……这样我就可以得到每 10 秒左右调用一次的东西,我将从那里获取它。

最佳答案

接下来是一个基本的服务应用程序。

请注意,如果您想使用 ServiceApp.exe/install 在 Windows Vista 及更高版本上安装该服务,您必须确保以管理员权限运行该应用。

另请注意,尽管有 fmShareDenyWrite,但在服务运行时可能无法查看日志文件的内容。至少在我停止服务之前,我无法使用 Notepad++ 打开文件。这可能与我在系统帐户(而不是我自己的用户帐户)下运行服务这一事实有关。

另外一句话:如果你想让你的服务暂停和继续,不要使用暂停和恢复。它们不是线程安全的,在 D2010+ 中已被弃用。使用 T(Simple)Event 或类似的东西来控制主工作线程的执行。如果您不想暂停和继续您的服务,只需将 AllowPause 设置为 False。

unit ServiceApp_fm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
TService1 = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
FWorker: TThread;
public
function GetServiceController: TServiceController; override;
end;

var
Service1: TService1;

implementation

{$R *.DFM}

type
TMainWorkThread = class(TThread)
private
{$IFDEF UNICODE}
FLog: TStreamWriter;
{$ELSE}
FLog: TFileStream;
{$ENDIF}
FRepetition: Cardinal;
public
constructor Create;
destructor Destroy; override;

procedure Execute; override;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
FWorker := TMainWorkThread.Create;
Started := True;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
// Thread should be freed as well as terminated so we don't have a memory
// leak. Use FreeAndNil so we can also recognize when the thread isn't
// available. (When the service has been stopped but the process hasn't ended
// yet or may not even end when the service is restarted instead of "just" stopped.
if FWorker <> nil then
begin
FWorker.Terminate;
while WaitForSingleObject(FWorker.Handle, WaitHint-100) = WAIT_TIMEOUT do
ReportStatus;
FreeAndNil(FWorker);
end;
Stopped := True;
end;

{ TMainWorkThread }

constructor TMainWorkThread.Create;
var
FileName: String;
begin
inherited Create({CreateSuspended=}False);

FileName := ExtractFilePath(ParamStr(0)) + '\WorkerLog.txt';
{$IFDEF UNICODE}
FLog := TStreamWriter.Create(FileName, False, TEncoding.Unicode);
{$ELSE}
FLog := TFileStream.Create(FileName, fmCreate);
{$ENDIF}
end;

destructor TMainWorkThread.Destroy;
begin
FLog.Free;
inherited;
end;

procedure TMainWorkThread.Execute;
var
Text: string;
begin
inherited;

while not Terminated do begin
Inc(FRepetition);
Text := Format('Logging repetition %d'#13#10, [FRepetition]);

{$IFDEF UNICODE}
FLog.Write(Text);
{$ELSE}
FLog.Write(Text[1], Length(Text));
{$ENDIF}
Sleep(1000);
end;
end;

end.

关于windows - 服务 OnExecute 失败,生成的线程未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5744373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com