Я новичок в Multithreading
, у меня есть процедура, которая проходит ряд операций с использованием indy (login на сайт и загружать файлы и ...), иногда, когда сайт не реагирует или занимает слишком много времени, исключение не происходит даже с idHttp.connectTimeout
и idHttp.readTimeout
, установленными на определенную сумму, или иногда это происходит, но не в то время, когда у меня есть задано !!, поэтому я предпочитаю проверять задачу и посмотреть, работает ли файл ITask
в течение 30 секунд, он должен быть прерван!, я попытался использовать itask.cancel
, но он отменяется только в том случае, если что-то находится в очереди и не завершается задача, которая уже выполняется, каково решение моей проблемы?Использование System.threading, как проверить и завершить уже запущенный iTask в случае запуска в течение определенного времени
только так вы знаете, что происходит в моей программе:
первоначально моя программа создает классы на основе списка профилей и начинается процесс входа в систему и загрузки, я хочу, чтобы завершить любой startDownloadProcess
, который принимает более чем на 30 сек
вот пример кода:
// 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 секунд, она завершается и очередь продолжается.
Теперь я знаю, что с этим кодом может быть что-то не так, но вот почему я здесь, я немного потерял о том, как действовать дальше, или если то, что я делаю, абсолютно правильно!
Вы должны регулярно проверять внутри задачи, если он аннулируется: 'если TTask.CurrentTask.Status = TTaskStatus.Canceled то выход,' –
@LURD, но не задача запустить только один раз ?, если да, то как я могу проверить статус, если он застревает в строке (например, IdHttp.get()); –
Вы не можете прекратить выполнение задач и потоков извне. Вам нужно, чтобы они сотрудничали. Вы можете завершить процессы. –