2016-10-22 18 views
0

Я новичок в 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 секунд, она завершается и очередь продолжается.

Теперь я знаю, что с этим кодом может быть что-то не так, но вот почему я здесь, я немного потерял о том, как действовать дальше, или если то, что я делаю, абсолютно правильно!

+2

Вы должны регулярно проверять внутри задачи, если он аннулируется: 'если TTask.CurrentTask.Status = TTaskStatus.Canceled то выход,' –

+0

@LURD, но не задача запустить только один раз ?, если да, то как я могу проверить статус, если он застревает в строке (например, IdHttp.get()); –

+1

Вы не можете прекратить выполнение задач и потоков извне. Вам нужно, чтобы они сотрудничали. Вы можете завершить процессы. –

ответ

1

вы говорите, что вы новичок в многопоточности, поэтому не забудьте никогда (никогда) использовать TTASK/ITask или аналогичный TParalel. это абсолютно глючит! использовать вместо TAnonymousThread

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