상속받아사용하시면 됩니당~
----- 헤더입니다. -----
#ifndef unitZWaitableH
#define unitZWaitableH
#include <Classes.hpp>
class TZWaitable
{
public:
TZWaitable();
virtual ~TZWaitable();
private:
long FWaitCount;
HANDLE FEvent;
public:
void wait();
void wait(int iMsec);
void notify();
int isLocked();
};
#endif
----- 소스 입니다. -----
#include "unitZCommon.h"
#include "unitZGConout.h"
#pragma hdrstop
#include "unitZWaitable.h"
#pragma package(smart_init)
TZWaitable::TZWaitable()
{
FWaitCount = 0;
FEvent = CreateEvent( NULL, true, false, NULL );
}
TZWaitable::~TZWaitable()
{
CloseHandle(FEvent);
SET_NULL(FEvent);
}
void TZWaitable::wait()
{
if( FWaitCount )
{
return ;
}
InterlockedIncrement(&FWaitCount);
ResetEvent(FEvent);
if( WAIT_OBJECT_0 == WaitForSingleObject(FEvent, INFINITE) )
{
#ifdef APP_INFO
zout.trace("%s%s\n", APP_INFO, "TZWaitable::wait | WAIT_OBJECT_0 == WaitForSingleObject(FEvent, INFINITE)");
#endif
InterlockedDecrement(&FWaitCount);
}
}
void TZWaitable::wait(int iMsec)
{
if( FWaitCount )
{
return ;
}
InterlockedIncrement(&FWaitCount);
ResetEvent(FEvent);
DWORD dwRet = WaitForSingleObject(FEvent, iMsec);
if( (dwRet == WAIT_OBJECT_0) ||
(dwRet == WAIT_TIMEOUT)
)
{
#ifdef APP_INFO
zout.trace("%s%s\n", APP_INFO, "TZWaitable::wait | (dwRet == WAIT_OBJECT_0) || (dwRet == WAIT_TIMEOUT)");
#endif
InterlockedDecrement(&FWaitCount);
}
else
{
#ifdef APP_DOUBT
zout.trace("%sTZWaitable::wait | return %d why?\n", APP_DOUBT, dwRet);
#endif
InterlockedDecrement(&FWaitCount);
}
}
void TZWaitable::notify()
{
if( FWaitCount <= 0 )
{
FWaitCount = 0;
return ;
}
SetEvent(FEvent);
}
int TZWaitable::isLocked()
{
return FWaitCount;
}
|