Q&A

  • 프로그램이 그냥 종료됩니다.
요새 한참 쓰레드 공부중인 넘입니다.

다름이 아니라 여기 저기 돌아다니고, 책도 참고해서 쓰레드 테스트 프로그램을 하나 만들고 있습니다.

초보라서 쓰레드를 어떤 형식으로 만들어야 하는지도 잘 모르는체 만들어 보고 있습니다.

제 나름대로 잘 만들었다 생각하고 돌려 보았는데 10분 정도 지나면 자동으로 종료가 됩니다.

제발 힌트라도 부탁드리겠습니다.

프로그램의 내용은 간단히, 프로그램 실행하고 시작 버튼을 눌르면 쓰레드를 50개 정도 생성합니다.

initializecriticalsection(CS1);
for i = 0 to 49 then begin
IdThread := TestThread.create(i);
end;

constructor에서 idhttp를 배열로 정의해서 쓰레드 갯수에 맞게 생성을 해주었습니다.

constructor TestThread.create(TrdNum : integer);
begin
inherited create(false);
FreeOnTerminate := true;
ChkNum := TrdNum;
IdHttp[ChkNum] := TIdHTTP.Create(form1);
IdCookie[ChkNum] := TIdCookieManager.Create(form1);
with IdHttp[ChkNum] do begin
   CookieManager := IdCookie[chknum];
   AllowCookies := True;
   ReadTimeout := 30000;
   request.AcceptLanguage := 'gzip, deflate';
   Request.ContentType := 'multipart/form-data';
   Request.Accept := '*/*';
   Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
end;
end;

destructor에서는 아래와 같이 쓰레드가 종료 되었을 경우 해당 쓰레드의 idhttp를 종료해주었습니다.
destructor YahoMan.destroy;
begin
IdHttp[ChkNum].Free;
IdCookie[ChkNum].Free;
inc(FlagTrdNum);

if FlagTrdNum = 50 then begin
   구문
end;

inherited destroy;

end;

execute 영역에서는 while문을 가지고 아래와 같이 했습니다. stopsend가 0이면 종료되게 했습니다.

procedure TestThread.execute
begin
while (not terminated) and (StopSend < 1) do begin
   try
     entercriticalsection(CS1);
       구문
     leavecriticalsection(CS1);

       구문

     entercriticalsection(CS1);
       구문
     leavecriticalsection(CS1); //중복되면 안되는게 있어서 크리티컬절이 두번 들어갔습니다.
   except
     오류일 경우의 구문
   end;
end;

if terminated then destroy;
end;

근데 문제는 처음에는 잘 돌아갑니다. 10분 정도 돌아가면 어김없이 프로그램이 화면에서 자취를 감춰버립니다. 즉, 자동으로 걍 종료됩니다.

몇일 동안 이게 왜 이런가 소스도 찾아보고 여기 저기 돌아다녀 보고 책도 보고 했지만 도무지 원인을 찾을 수가 없습니다.

왜 그런지 힌트만이라도 부탁드립니다.

쓰레드를 공부한지 얼마 안되서 사실 어떤 형식으로 쓰레드를 만들어야 하는지도 모릅니다.

다만 여기 저기 돌아 다니면서 배우고 있습니다.

도움 부탁드립니다.

감사합니다.
0  COMMENTS