|
임펠리테리입니다.
이필호님, 제 사이트에서는 정말 오랜만이군요. ^^
소스 전체가 아니라 일부만 있어서 제가 질문을 제대로 이해했는지 확신이 안서네요.
제 맘대로 떠들어 보도록 하겠습니다. ^^;;
일단, Execute() 함수의 끝에서 Suspended를 설정한다고 하더라도 아무 소용이 없습니다.
Execute()는 win32 쓰레드 그 자체이므로, 일반적으로는 Execute() 내에서 루프를 돌아야 합니다.
Suspended를 설정하는 코드도 루프 안에 있어야 하구요.
제가 이해한 바로는, 쓰레드 자체는 종료가 되었으나 FreeOnTerminate가 true로 설정되어 있지 않아 TThread 객체가 파괴만 되지 않고 메모리에 남아있는 것 같습니다.
이 FreeOnTerminate 프로퍼티는 디폴트가 false이므로 true로 명시적으로 세팅해주지 않으면 쓰레드의 동작이 종료되어도 TThread 객체는 파괴되지 않습니다.
그럼 참고하시길...
이필호 님이 쓰신 글 :
: Thread가 무한정 생성되는것이 아니기 때문에 일정갯수를 미리 생성해서 두고..
:
: 할일이 생기면 현재 놀고 있는 Thread에 일을 할당하고 실행시키고...
:
: 머 이렇게 하려고 합니다.
:
: 그런데 문제가 생기더군요..
:
: TThread에 Suspended 라는 프로퍼티가 있긴 한데, 일을 끝내도 true로 설정되지 않아서 놀고 있는지 확인이 안됩니다.
:
: Debug결과 TThread 의 Private변수인 FFinshed 는 true인데, FSuspended 는 false 이더군요...
:
: private 변수인 FFinshed 에 접근하자니.. 안되고, Suspended 는 true로 설정되지 않구...
:
: 그래서 Thread에 일부러 Suspended = true; 로 코딩했으나 결과는 마찬가지더군요..
:
: 그래서 말인데요..
:
: Thread가 현재 놀고 있는지 아님 먼 일을 하고 있는지 확인 하는 방법좀 알려주세요..
:
: 제가 한 코딩을 붙여넣겠습니다..
:
: 한수 부탁드립니다.... 그럼 이만..
:
: ---------------------------------------------------
: Thread를 호출하는 쪽
: ---------------------------------------------------
: int i = 0;
:
: while(true)
: {
: for(i = 0; i < MAX_THREAD_COUNT; i++)
: {
: if(FThread[i]->Suspended)
: {
: FThread[i]->Resume();
: break;
: }
: }
: if(i >= MAX_THREAD_COUNT)
: continue; // 쉬는 Thread가 없으면 다시 루프를 돌고..
: else
: break; // 쉬는 Thread에 적절하게 했으면 루프를 빠져나간다.
: }
:
:
: ---------------------------------------------------
: Thread execute() 함수
: ---------------------------------------------------
: void __fastcall XThread::Execute()
: {
: // 중간 생략....
:
: Suspended = true;
: }
:
:
|