我是Multithreading
的新手,我有一个使用indy进行一系列操作的程序(登录网站并下载文件......),有时当网站没有响应时或者它花费的时间太长,即使将idHttp.connectTimeout
和idHttp.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秒,它将终止,队列继续。
现在我知道该代码可能存在很多问题,但这就是为什么我在这里,我对如何继续或我正在做的事情是否正确感到有点失落一点都没有!
答案 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;