首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows服务与TThread

Windows服务与TThread
EN

Stack Overflow用户
提问于 2015-07-08 17:46:08
回答 1查看 1.2K关注 0票数 2

我是Windows Service的新手,我需要做这个工作.我从这里获得了我的代码,这只是这个代码的一个副本。但我正在尝试从服务中执行一些HTTP请求。对于这项工作,我选择创建一个新线程,并在线程中执行请求.代码的这一部分是(这是我从上面链接上的原始代码中添加的唯一内容):

代码语言:javascript
复制
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秒执行一次请求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-08 18:08:36

我调用MyThread.Create过程,在OnServiceCreate内部

TService.OnCreate事件是创建线程的错误位置。该事件不仅在服务启动时触发,而且在安装(Un)服务时触发。而是在OnStart事件中创建线程,该线程仅在服务启动时触发。

它只提出一个请求。当线程还活着的时候,它不应该每5秒执行一次请求?

您的线程没有执行任何错误处理。如果TIdHTTP.Get()由于任何原因失败,它会引发一个未捕获的异常,因此您的线程将终止自身。

也没有理由在每次循环迭代中重新创建TIdHTTP对象。

我强烈建议您不要使用FreeOnTerminate=true。将其保留为false,然后终止并释放OnStop/OnShutdown`事件中的线程。

尝试更像这样的东西:

代码语言:javascript
复制
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;

代码语言:javascript
复制
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;
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31299959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档