2016-10-22 5 views
0

나는 초보자 인 Multithreading입니다. indy를 사용하여 일련의 작업을 수행하는 절차가 있습니다 (로그인 사이트에 다운로드하고 파일을 다운로드하는 등 ...). 때로는 사이트가 응답하지 않거나 너무 오래 걸릴 때 idHttp.connectTimeoutidHttp.readTimeout이 특정 금액으로 설정되거나 예외적으로 발생하지 않는 경우도 있습니다. 지정된 !! !! 그래서 내가 작업을 확인하고 예를 들어 ITask이 30 초 동안 실행 중인지 확인하는 것이 좋습니다. 종료해야합니다! itask.cancel을 사용해 보았지만 대기열에 있고 종료되지 않는 경우에만 취소합니다. 이미 실행중인 작업, 내 문제의 해결 방법은 무엇입니까?System.threading을 사용하여 특정 시간 동안 실행 된 경우 이미 시작된 iTask를 확인하고 종료하는 방법

은 그래서 당신이 내 프로그램에서 무슨 일이 일어나고 있는지 알고 : 원래 내 프로그램 프로파일 목록을 기반으로 클래스를 생성하고 로그인 및 다운로드 프로세스를 시작

, 내가 이상 소요 어떤 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 초 여기
보다 코드 예제
각 작업이 이전 작업 (대기열)에 종속되어 이전 작업이 완료 될 때까지 대기하고 작업에 30 초 이상이 걸리면 작업이 종료되고 대기열이 계속됩니다.

이제 코드에 문제가 많을 수도 있지만 그 이유는 여기에 있습니다. 진행 방법에 대해 약간 분실되었거나 내가하고있는 일이 전혀 잘못되었습니다!

+2

당신은 정기적으로 작업 내부 확인해야합니다 TAnonymousThread :'경우 TTask.CurrentTask.Status = TTaskStatus.Canceled 후 종료,' –

+0

@LURD하지만 작업이 한 번만 실행되지 않습니다 ?, 만약 그렇다면 어떻게하면 라인 (예 : IdHttp.get())에 갇혀있어 상태를 확인할 수 있습니다; –

+1

외부에서 작업 및 스레드를 종료 할 수 없습니다. 협조 할 필요가 있습니다. 프로세스를 종료 할 수 있습니다. –

답변

1

당신은 멀티 스레딩에있어서 새로운 말을하기 때문에 결코 TTASK/ITask 또는 유사한 TParalel을 사용하지 마십시오. 그것은 완전히 버그입니다! 사용하는 대신이 취소되는 경우

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