大白思路:使用单例模式和多线程,为系统起一个线程,当有需要时通过通知notify()来触发event,激活处于等待状态的线程,完成所需要的逻辑功能。(可用此方法实现日志文件系统等功能,当需要写入日志文件时,在CTrace()生命期结束后flush()函数中将日志内容add()进CLogger(单例)缓存中,调用CLogger.notify()就可激活日志文件系统线程)
CEvent类:用来封装使用event来管理线程的方法class CEvent
{
public:
CEvent(char* name = NULL);
int wait(int mill )
{
printf("CEvent开始等待.....\n");
int ret = WaitForSingleObject( _event,(DWORD)mill );
if( ret == WAIT_OBJECT_0 )
{
printf( "CEvent等待成功!\n");
return 1;
}
if( ret == WAIT_TIMEOUT )
{
printf( "CEvent等待超时!\n");
return 0;
}
if( ret == WAIT_FAILED )
{
printf( "CEvent等待错误!\n");
return -1;
}
}
void notify()
{
if( SetEvent(_event) )
{
printf("notify success!\n");
}
else
{
printf("notify failed!\n");
}
}
~CEvent(){
printf("关闭CEvent!\n");
//CloseHandle(_event); //_event计数会减为0,系统释放该内核对象的内存
}
private:
char* _name;
HANDLE _event;
};
CMyEvent类:这个是用户类,用户可以在这个类里实现自己需要的逻辑功能,通过该类notify()、wait()来实现线程的激活和等待
class CMyEvent
{
public:
static CMyEvent* instance();
void wait(int mill = INFINITE)
{
int ret = event.wait(mill);
if( ret == 1 )
printf( "CMyEvent等待成功!\n");
else if( ret == 0 )
printf( "CMyEvent等待超时!\n");
else if( ret == -1 )
printf( "CMyEvent等待错误!\n");
else
printf("CMyEvent等到了未知的结果!\n");
}
void notify()
{
event.notify();
}
/*******可添加想要实现的功能******/
private:
CEvent event;
CMyEvent(){
printf("开始生产CMyEvent!\n");
//event = CEvent(); //CEvent()临时变量浅拷贝赋值到event,当CMyEvent构造函数结束后,_event已被关闭
}
};
CMyEvent* CMyEvent::instance()
{
static CMyEvent* inst = new CMyEvent();
return inst;
}
线程函数:使用的是_beginthreadex(),一开始没加__stdcall,而C/C++默认函数调用规范是__cdecl,编译的时候无法转换蛋疼疼地错了!
unsigned __stdcall threadFun( void* arg ) //
{
printf("进入了CMyEvent线程!\n开始等待.....\n");
while(1)
{
CMyEvent::instance()->wait();
}
return 0;
}
简单测试:
void main()
{
HANDLE tHandle = (HANDLE)_beginthreadex( NULL,0,threadFun,NULL,0,NULL );
while( getchar() )
{
CMyEvent::instance()->notify();
}
}