|
임펠리테리입니다.
제가 잘못 이해한건지 아님 이필호님이 잘못 이해하신 건지..
제가 말씀드린 것은, 쓰레드가 종료되지 않은 상태로 두려면, 쓰레드 내부에서 Suspend시키는 코드는 루프 내에 있어야 한다는 거였는데요.
그럼 이만...
이필호 님이 쓰신 글 :
: 안녕하세요.. 네.. 여기에 자주는 오는는데요.. 글을 안썼을 뿐이죠..
: 사실 임프님 팁도 많이 도움을 받고 있습니다.
:
: 답변주신거 감사합니다..
:
: 하지만, 제가 질문드린것은 스레드가 종료되지 않고 메모리에 살아있게 하고..
:
: 현재 일을 하고 있는지 아닌지 알수 있는 방법이 있는지 해서 질문드린거예요..
:
: 즉, 30개의 쓰레드를 미리 생성해 놓고,
:
: 일을 하고 있지 않는 쓰레드를 찾아서 그 쓰레드에 일을 시키고 싶은거죠..
:
: 그러니까 30개 모두 메모리에서 해제를 시키지 않은 상태에서 일을 하고 있는지 아닌지를 알고 싶은거죠..
:
: 메모리를 자꾸 생성하고 해제하는 시간이 걸리는 것 같아서 메모리를 해제를 안시키려구 하니까
:
: 잘 모르겠더라구요..
:
: 답변하신 내용은 이미 알고 있는 거 드라구요...
:
: 하여간 답변 주신거는 감사하구요..
:
: 다시 한번 답변 주시면 감사하겠습니다...
:
: 그럼 이만.
:
:
:
: 박지훈.임프 님이 쓰신 글 :
: : 임펠리테리입니다.
: : 이필호님, 제 사이트에서는 정말 오랜만이군요. ^^
: :
: : 소스 전체가 아니라 일부만 있어서 제가 질문을 제대로 이해했는지 확신이 안서네요.
: : 제 맘대로 떠들어 보도록 하겠습니다. ^^;;
: :
: : 일단, 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;
: : : }
: : :
: : :
|