我是Windows Service的新手,我需要做这个工作.我从这里获得了我的代码,这只是这个代码的一个副本。但我正在尝试从服务中执行一些HTTP请求。对于这项工作,我选择创建一个新线程,并在线程中执行请求.代码的这一部分是(这是我从上面链接上的原始代码中添加的唯一内容):
type
MyThread = class(TThread)
strict private
protected
constructor Create;
procedure Execute; override;
end;
constructor MyThread.Create;
begin
inherited Create(false);
FreeOnTerminate:= true;
Priority:= tpNormal;
end;
procedure MyThread.Execute;
var
IdHTTP: TIdHTTP;
begin
while not(Terminated) do
begin
IdHTTP := TIdHTTP.Create(nil);
IdHTTP.Get('http://google.com');
IdHTTP.Free;
Sleep(5000);
end;
end;我在MyThread.Create内部调用OnServiceCreate过程,但它只发出一个请求。当线程还活着的时候,它不应该每5秒执行一次请求?
发布于 2015-07-08 18:08:36
我调用MyThread.Create过程,在OnServiceCreate内部
TService.OnCreate事件是创建线程的错误位置。该事件不仅在服务启动时触发,而且在安装(Un)服务时触发。而是在OnStart事件中创建线程,该线程仅在服务启动时触发。
它只提出一个请求。当线程还活着的时候,它不应该每5秒执行一次请求?
您的线程没有执行任何错误处理。如果TIdHTTP.Get()由于任何原因失败,它会引发一个未捕获的异常,因此您的线程将终止自身。
也没有理由在每次循环迭代中重新创建TIdHTTP对象。
我强烈建议您不要使用FreeOnTerminate=true。将其保留为false,然后终止并释放OnStop/OnShutdown`事件中的线程。
尝试更像这样的东西:
type
MyThread = class(TThread)
protected
procedure Execute; override;
public
constructor Create;
end;
constructor MyThread.Create;
begin
inherited Create(False);
end;
procedure MyThread.Execute;
var
IdHTTP: TIdHTTP;
begin
IdHTTP := TIdHTTP.Create(nil);
try
while not Terminated do
begin
try
IdHTTP.Get('http://google.com');
// success, do something
except
// failed, do something else
end;
Sleep(5000);
end;
finally
IdHTTP.Free;
end;
end;
type
TService1 = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
Thread: MyThread;
end;
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
Thread := MyThread.Create;
Started := True;
end;
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
if Thread <> nil then
begin
Thread.Terminate;
while WaitForSingleObject(Thread.Handle, WaitHint-100) = WAIT_TIMEOUT do
ReportStatus;
FreeAndNil(Thread);
end;
Stopped := True;
end;https://stackoverflow.com/questions/31299959
复制相似问题