2012-03-02 4 views
3

Delphi에서 멀티 스레드 응용 프로그램을 작업하는 것은 처음이므로 모든 것이 여전히 나에게 맞는 것이지만 많이 읽습니다.기다림없이 Delphi Indy 스레드 멈추기 Timeout

내 스레드는 간단합니다. Indy (IdHTTP)를 사용하여 웹 페이지의 콘텐츠를 가져온 다음 콘텐츠에 문자열이 포함되어 있는지 확인합니다. 여기에 문제 없습니다.

이제 스레드를 종료하려면 WHILE DO와 함께 부울을 사용합니다. 그것은 작동하지만 여기에 문제가 있습니다 : 나는 Indy와 Timeout을 사용하는 것처럼 스레드가 끝날 때까지 (서버가 응답하지 않을 때) 타임 아웃 기간의 끝을 기다려야 할 때가 있습니다 ...

짜증나는데, 특히 +200 스레드를 사용할 때 특히 그렇습니다. 멀티 스레드 및 유사한 절차를 사용하는 다른 소프트웨어의 경우 "중지"를 클릭하면 몇 초 만에 모두 중지되고 그게 내가 필요한 것입니다.

은 내가

그래서, 내가 여기 손실 조금 있어요 ... IdHTTP는 "내 읽기 instuctions"할 수 있도록, 부동액을 사용해야 함을 읽어 보시기 바랍니다. 여기가 매우 필요하다고 생각하지 않지만 내 코드입니다 : Beny

조명에 미리 http://pastebin.com/G7De8bgb

감사합니다 :)

+3

왜 GET을 중지 하시겠습니까? 왜 그걸 끝내고 있니? TidAntiFreeze 근처에 가지 마세요. –

+0

예를 들어 프로세스가 너무 길면. 나는 언제든지 시술을 중단 할 수 있기를 바란다. 쓰레드를 죽이는 것과 같지만 안전한 방법으로 쓰십시오. 감사. Beny – Beny

답변

6

클래스 TidHTTP에는 OnWork 이벤트가 있습니다. 데이터 다운로드 또는 업로드를 취소하려면이 이벤트를 사용하십시오. 이 일정으로 취소하는 방법? 화재는 조용한 예외를 저지하십시오.

THTTPThread = class(TThread) 
    private 
     HTTPComponent: TidHTTP; 
     procedure OnHTTPProgress(ASender: TObject; AWorkMode: TWorkMode; 
            AWorkCount: Int64); 
    published 
     procedure execute(); 
end; 

implementation 
procedure THTTPThread.execute; 
begin 
    Self.HTTPComponent := TidHTTP.Create(nil); 
    with HTTPComponent do 
    begin 
     OnWork := Self.OnHTTPProgress; 
     Get('http://www.google.com'); 
    end; 
end; 

procedure THTTPThread.OnHTTPProgress(ASender: TObject; AWorkMode: TWorkMode; 
    AWorkCount: Int64); 
begin 

    if Self.Terminated then 
     Abort; 
end; 

이 OnWork가 호출되는 단계 무작위 것을 고려 :

는 의사 코드입니다.이벤트는 요청의 중간, 요청시 또는 끝 부분에서 호출 될 수 있습니다. 위의 코드는 브라우저에서 중지 버튼을 누르는 것처럼 작동합니다.

[UPDATE] 서버가 응답 할 때 스레드가 중단 될 때 OnWork 이벤트가 호출되지 않으면 "마지막 응답"이 지정된 밀리 초 전에 수신 된 경우 시간 초과를 사용할 수 있습니다 . 이에 대해서는 GetTickCount을 사용하십시오.

+0

아, 정말 재미 있습니다! 나는 시험해 볼게. 의견을 보내 주셔서 감사합니다. Beny – Beny

+0

첫 번째 게시물부터 Indy for ip * Works를 변경했습니다. 모든 것은 동일하게 유지되고, 나는 단지'HTTP.Interrupt;'를 구현하려고 시도한다. 그래서 Stop을 클릭하면 새 스레드 생성을 중단하지만 이미 시작된 스레드를 인터럽트하기 위해 코드를 어디에 둘 수 있는지 알지 못합니다 ... – Beny

+0

오랜 연구 끝에 올바른 솔루션을 찾은 것 같습니다. 다시 감사합니다 ! 베스트. Beny;) – Beny

2

나는 비슷한 인디 사용 문제 및 웹 서비스 했어 우리가 말하고있는 시스템도 최고로 신뢰할 수 없었습니다 (일부 통화에서는 30 분의 읽기 타임 아웃을 설정해야했습니다).

리오 콜 (및 귀하의 IdHTTP) 호출이 당신 canel을 차단하고 있기 때문에/그들을 직접 중단합니다.

그러나 (다른 스레드를 사용하는 경우) get/webcall에서 예외가 발생할 기본 소켓의 연결을 끊을 수 있습니다.

TIdHTTP를 사용하여 아이디어를 테스트하기 위해 간단한 해킹을 수행했으며 리오와 마찬가지로 작동하는 것으로 보입니다.

주/제어 스레드에서 IDHTTP.Disconnect를 호출 한 다음 스레드에서 발생하는 예외를 catch해야합니다. 코드를 살펴보면 Thread.Execute에 IdHTTP를 작성하고 스레드 클래스의 Abort 함수가 소켓 연결을 간단히 끊을 수 있도록 클래스의 생성자에 대한 선언을 이동해야합니다.

필자는 Delph 7과 INDY10을 사용하여 설정을 변경했습니다. 사람이 더/덜 agresive 방법을 알고 있다면

을하는 데 도움이

희망 BTW

내가 너무 그것을보고 싶어요.

+0

IdHTTP 연결 끊기 아이디어에 감사드립니다. 이미 시작된 코드 연결 끊기 스레드를 배치 할 위치에 대해 조금만 알면됩니다. Beny – Beny

관련 문제