使用System.threading,如果在特定时间内运行,如何检查和终止已经启动的iTask

时间:2016-10-22 09:34:11

标签: multithreading delphi delphi-xe indy idhttp

我是Multithreading的新手,我有一个使用indy进行一系列操作的程序(登录网站并下载文件......),有时当网站没有响应时或者它花费的时间太长,即使将idHttp.connectTimeoutidHttp.readTimeout设置为特定数量也不会发生异常,或者有时它确实发生但在我指定的时间没有!!这就是为什么我更喜欢检查任务,看看例如ITask是否正在运行30秒,它必须被终止!,我尝试使用itask.cancel,但只有当某些东西在队列中并且没有终止时才会取消已经运行的任务,我的问题的解决方案是什么?

只是让您知道我的计划中发生了什么:

最初我的程序根据配置文件列表创建类并启动登录和下载过程,我想终止任何超过30秒的startDownloadProcess 这是一个代码示例:

// this is what i used to do
for I := 0 to mProfileList.count - 1 do
begin
  myClass := TMyClass.create(mProfileList[i]);
  //sometimes this takes a very very long time and i don't want that.
  myClass.startDownloadProcess;
end;

// here is what i have in mind 
for I := 0 to mProfileList.count - 1 do
begin
  mITaskArray[i] := TTask.run(procedure
    begin
     myClass := TMyClass.create(mProfileList[i]);
     myClass.startDownloadProcess;
    end);
end;

我需要什么:
我希望每个任务都依赖于前一个任务(一个队列),并等到前一个任务完成,如果任务需要超过30秒,它将终止,队列继续。

现在我知道该代码可能存在很多问题,但这就是为什么我在这里,我对如何继续或我正在做的事情是否正确感到有点失落一点都没有!

1 个答案:

答案 0 :(得分:1)

你说你是多线程新手,所以切记永远不要(从不)使用TTASK / ITask或类似的TParalel。它完全越野车!请改用TAnonymousThread

  MyThread := TThread.createAnonymousThread(
    Procedure
    Begin
       repeat
         if MyThread.checkterminated then exit;
         if moreThan30secondsRunning then exit;
         ....
       until wordDone;
    end).start;