当前位置: 首页 > 工具软件 > SoUI > 使用案例 >

SOUI中事件中心的使用

施凡
2023-12-01

在soui中为了方便将工作者线程中的处理结果及时反馈到UI线程设计了事件中心来解决此类问题。

在使用事件中心需要注意的事项如下:

首先, 要new一个事件中心对象,既然new了对象当然就要delete,相关代码如下:

	SNotifyCenter *pNotifyCenter = new SNotifyCenter;
        // BLOCK: Run application
        {
            CMainDlg dlgMain;
            dlgMain.Create(GetActiveWindow());
            dlgMain.SendMessage(WM_INITDIALOG);
            dlgMain.CenterWindow(dlgMain.m_hWnd);
            dlgMain.ShowWindow(SW_SHOWNORMAL);
            nRet = theApp->Run(dlgMain.m_hWnd);
        }
	delete pNotifyCenter;

其次,要将事件添加到事件中心,相关代码如下:

	//向事件中心添加事件
	SNotifyCenter::getSingleton().addEvent(EVENTID(EventLoginModule2UI_AccLogin));
	SNotifyCenter::getSingleton().addEvent(EVENTID(EventLoginModule2UI_GetToken));
	SNotifyCenter::getSingleton().addEvent(EVENTID(EventLoginModule2UI_SmsLogin));

再次,将事件跟处理函数绑定,相关代码如下:

事件处理函数定义:

protected:
	bool OnEventLoginModule2UIAccLogin(EventArgs* e);
	bool OnEventLoginModule2UISmsLogin(EventArgs* e);
	bool OnEventLoginModule2UIGetToken(EventArgs* e);
处理函数跟事件绑定:

protected:
	//soui消息
	EVENT_MAP_BEGIN()
		EVENT_HANDLER(EVT_LOGINMODULE2UI_ACCLOGIN, OnEventLoginModule2UIAccLogin)
		EVENT_HANDLER(EVT_LOGINMODULE2UI_SMSLOGIN, OnEventLoginModule2UISmsLogin)
		EVENT_HANDLER(EVT_LOGINMODULE2UI_GETTOKEN, OnEventLoginModule2UIGetToken)
	EVENT_MAP_END()


事件定义相关代码:

class EventLoginModule2UI_AccLogin : public TplEventArgs<EventLoginModule2UI_AccLogin>
{
	SOUI_CLASS_NAME(EventLoginModule2UI_AccLogin,L"event_loginmodule2UI_acclogin")
public:
	EventLoginModule2UI_AccLogin(SObject* pSender) 
		: TplEventArgs<EventLoginModule2UI_AccLogin>(pSender){}
	enum{EventID = EVT_LOGINMODULE2UI_ACCLOGIN};

	DS_LOGINSAASRETINFO*	m_LoginSaasRetInfo;
};

class EventLoginModule2UI_SmsLogin : public TplEventArgs<EventLoginModule2UI_SmsLogin>
{
	SOUI_CLASS_NAME(EventLoginModule2UI_SmsLogin, L"event_loginmodule2UI_smslogin")
public:
	EventLoginModule2UI_SmsLogin(SObject* pSender)
		: TplEventArgs<EventLoginModule2UI_SmsLogin>(pSender){}
	enum{EventID = EVT_LOGINMODULE2UI_SMSLOGIN};

	DS_LOGINSAASRETINFO*	m_LoginSaasRetInfo;
};

class EventLoginModule2UI_GetToken : public TplEventArgs<EventLoginModule2UI_GetToken>
{
	SOUI_CLASS_NAME(EventLoginModule2UI_GetToken, L"event_loginmodule2UI_gettoken")
public:
	EventLoginModule2UI_GetToken(SObject* pSender)
		: TplEventArgs<EventLoginModule2UI_GetToken>(pSender){}
	enum{EventID = EVT_LOGINMODULE2UI_GETTOKEN};

	DS_KFTOKENINFO*		m_pKfTokenInfo;
};

事件触发相关代码:

	EventLoginModule2UI_GetToken* pEvt = new EventLoginModule2UI_GetToken(this);
	pEvt->m_pKfTokenInfo = pInfo;
	SNotifyCenter::getSingleton().FireEventAsync(pEvt);
	pEvt->Release();

事件ID定义为一个全局的宏。

 类似资料: