class TAniThread : public TThread
{
private:
TQueue* m_pQueue;
TEvent* m_pEvent;
protected:
void __fastcall BeforeDestruction();
void __fastcall Execute();
public:
__fastcall TAniThread();
void __fastcall Stop();
bool __fastcall Push(void* pData);
};
__fastcall TAniThread::TAniThread() : TThread(false)
{
m_pQueue = new TQueue();
m_pEvent = new TEvent();
}
void __fastcall TAniThread::BeforeDestruction()
{
// ... Queue Clear처리부분 필요
m_pQueue->Free();
m_pEvent->Free();
}
void __fastcall TAniThread::Execute()
{
// 전처리~~
while(Terminated == false)
{
m_pEvent->WaitFor(INFINITE);
if(Terminated == true)
break;
// .... Queue Pop 및 Poped Data 처리....
}
}
bool __fastcall TAniThread::Push(void* pData)
{
if(Terminated == false)
{
m_pQueue->Push(pData);
m_pEvent->SetEvent();
return true;
}
return false;
}
void __fastcall TAniThread::Stop()
{
if(Terminated == false)
{
Terminate();
m_pEvent->SetEvent();
}
}
-----< Caller >-----
// Thread생성 및 시작
m_pAniThread = new TAniThread();
// Data추가
m_pAniThread->Push(pData);
// Thread 중지 및 파괴
m_pAniThread->Stop();
m_pAniThread->Free();
이정도면 되지 않을까요??
==================================================================================================
땅주인 님이 쓰신 글 :
: 환경: RAD Studio XE5 ( C++ Builder XE5)
:
: Thread를 사용 중입니다. TEvent로 Event를 전달하고 동작하도록 하였습니다.
: Thread를 종료할 때 Sleep()을 쓰는 것이 좀 깨림찍한데요..
:
: 아래의 코드에서 Thread 종료 시킬 때 Sleep()으로 잠시 기다리는 것이 의미가 있는 것인 지?
: 그리고, Thread 종료 후 delete Thread했는데, Thread가 while 루프를 빠지면서 자동 종료하면 굳이 delete를 하지 않아도 되는 것 아닌 지?
:
: // Main Thread
: m_bAniThread = true
: m_pAniThread = new TAniThread(false);// not suspend
: ...
: // Thread 사용할 때
: ThreadQueue->Push(*pData); // Thread에서 사용할 데이터 Queue에 Push
: GAniEvent->SetEvent(); // Thread에 Event를 전달...
: ..
: //Thread 종료할 때..
: m_bAniThread = false;
: GAniEvent->SetEvent();
: Sleep(200); // 스레드가 종료될 때까지 잠깐 기다림 => 이거 필요할까?
: delete m_pAniThread; // 스레드가 자동 종료되면 이 코드가 필요할까요?
:
: Thread의 실행 코드
:
: // TAniThread
: TWaitResult Result;
: while ( FormMain->m_bAniThread ) {
: Result = GAniEvent->WaitFor(1000); // Wait 1 second
: ...
: }
: // While 루프 탈출 후 Thread 종료..
:
: