大白之路一:使用事件管理多线程

大白思路:使用单例模式和多线程,为系统起一个线程,当有需要时通过通知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();
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值