10 개의 스레드가 함께 작동합니다. 스레드를 시작한 후 15 초 후 작업이 완료되기 전에 모든 스레드가 종료되고 하나의 스레드 만 남습니다.
내 코드 :
procedure TForm1.Button2Click(Sender: TObject);
begin
AA;
BB;
CC;
DD;
EE;
FF;
GG;
HH;
II;
JJ;
end;
procedure TForm1.AA; //same procedure for BB,CC,DD,EE.FF,JJ,HH,II,JJ
begin
lHTTP := TIdHTTP.Create(nil);
TTask.Create(Procedure
try
//HTTP Opertations
finally
end;
end).Start;
end;
참고 Free
: AV를 받았는데 디버깅 방법을 모르기 때문에 HTTP 구성 요소를 사용할 수 없습니다 . 코드에서 올바르게 해제 할 위치는 어디입니까? 그러나 그것을 해제하지 않으면 코드는 잘 작동하지만 스레드는 종료됩니다. Dodge가 말했듯이 문제 일 수 있습니다.
TIdHTTP
구성 요소를 만드는 방법에 따르면 단순히 잘못되었습니다. 스레드 외부에서 객체를 생성하지 말고 스레드 내부에서 사용하면 안됩니다. 스레드로부터 안전하지 않습니다. 사용중인 곳과 동일한 스레드에서 만들어야합니다. 이것이 당신이 그것을 해제 할 수없는 이유입니다. 그래서 당신은 실제로 여기서 동시에 고쳐야 할 두 가지 문제가 있습니다.
또한 lHTTP
변수가 코드 범위에 속하지 않는다는 것을 깨달았 으므로 일부 전역 (또는 공유) 위치에서 선언했다고 가정하겠습니다. 각 스레드에는 자체 인스턴스에 대한 자체 변수가 필요합니다.
따라서 코드는 다음과 같이 보일 것입니다.
procedure TForm1.AA; //same procedure for BB,CC,DD,EE.FF,JJ,HH,II,JJ
begin
TTask.Create(Procedure
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
//HTTP Opertations
finally
lHTTP.Free;
end;
end).Start;
end;
다른 구성 요소 (예 TADOConnection
:)는 이러한 작업을 시도하면 완전히 실패하고 충돌합니다 (이러한 구성 요소는 COM을 사용하기 때문에). 다행히도 TIdHTTP
COM을 사용하지 않지만 같은 이유로 디자인에 여전히 결함이 있습니다.
이제 디버깅했다고 말할 때 실제 스레드에서 코드를 디버깅했지만 중단 점이 끝에 도달하기 전에 코드의 다른 위치로 점프했음을 의미하는 것 같습니다. 이는 스레드에서 디버거를 사용할 때 예상됩니다. 스레드에 들어가서 각 순차적 중단 점이 동일한 스레드에있을 것으로 기대할 수는 없습니다. 즉, 다른 스레드에 중단 점이 두 개 이상있는 경우 디버거가 서로 점프 할 가능성이 매우 높습니다. , 그들은 여러 스레드입니다. 일종의 작업 로그를 만드는 것이 좋으며 각 스레드는 상태와 위치를보고합니다.
말 그대로 대체 우주와 같습니다. 여러 개의 서로 다른 유사한 스레드가 서로 약간 다른 작업을 수행합니다. 델파이 디버거는 단순히 모든 대체 우주를 볼 수있는 시간의 군주입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다