在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();