soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SNotifyCenter.h
1#ifndef __SNOTIFYCENTER__H__
2#define __SNOTIFYCENTER__H__
3
4#include <core/SSingleton2.h>
6#include <interface/SNotifyCenter-i.h>
7#include <event/SEventSet.h>
8
9#if !defined(_WIN32) || _MSC_VER >= 1700 // VS2012
10#define ENABLE_RUNONUI
11#endif
12#ifdef ENABLE_RUNONUI
13#include <functional>
14// 将 闭包 传递到了 UI线程
15// 所以 这里 尽量 将 相同类型的 处理 放到一起 执行 而不是分开调用。
16
17// SendMessage [&] 中的 & 是指 fn里调用的变量 都是 引用拷贝的
18#define SRUNONUISYNC(fn) SNotifyCenter::getSingletonPtr()->RunOnUISync([&]() { fn })
19
20// PostMessage [=] 中的 等号 是指 fn里调用的变量 都是 值拷贝的
21#define SRUNONUI(fn) SNotifyCenter::getSingletonPtr()->RunOnUIAsync([=]() { fn })
22
23#endif
24
25SNSBEGIN
26
27/**
28 * @class TAutoEventMapReg
29 * @brief 自动注册和注销事件映射的模板类
30 * @tparam T 类型
31 */
32template <class T>
34 typedef TAutoEventMapReg<T> _thisClass;
35
36 public:
37 /**
38 * @brief 构造函数,自动注册事件映射
39 */
44
45 /**
46 * @brief 析构函数,自动注销事件映射
47 */
52
53 /**
54 * @brief 注册事件映射
55 */
57
58 /**
59 * @brief 注销事件映射
60 */
62
63 protected:
64 /**
65 * @brief 处理事件
66 * @param e 事件参数对象
67 * @return 成功返回TRUE,失败返回FALSE
68 */
69 BOOL OnEvent(IEvtArgs *e)
70 {
71 T *pThis = static_cast<T *>(this);
72 return pThis->_HandleEvent(e);
73 }
74};
75
76/**
77 * @struct INotifyCallback
78 * @brief 通知回调接口
79 */
81{
82 /**
83 * @brief 触发事件
84 * @param e 事件参数对象
85 */
86 virtual void OnFireEvent(IEvtArgs *e) = 0;
87
88 /**
89 * @brief 触发多个事件
90 */
91 virtual void OnFireEvts() = 0;
92};
93
94class SNotifyReceiver;
95
96/**
97 * @class SNotifyCenter
98 * @brief 通知中心类,管理事件的注册、注销和触发
99 */
100class SOUI_EXP SNotifyCenter
101 : public INotifyCenter
102 , public SSingleton2<SNotifyCenter>
103 , public SEventSet
104 , protected INotifyCallback {
105 SINGLETON2_TYPE(SINGLETON_NOTIFYCENTER)
106 friend SApplication;
107
108 private:
109 /**
110 * @brief 构造函数
111 * @param nIntervel 事件处理间隔时间(毫秒)
112 */
113 SNotifyCenter(int nIntervel = 20);
114
115 /**
116 * @brief 析构函数
117 */
118 ~SNotifyCenter(void);
119
120 public:
121 /**
122 * @brief 触发一个同步通知事件
123 * @param e 事件参数对象
124 *
125 * @details 只能在UI线程中调用
126 */
127 STDMETHOD_(void, FireEventSync)(THIS_ IEvtArgs *e) OVERRIDE;
128
129 /**
130 * @brief 触发一个异步通知事件
131 * @param e 事件参数对象
132 *
133 * @details 可以在非UI线程中调用,EventArgs *e必须是从堆上分配的内存,调用后使用Release释放引用计数
134 */
135 STDMETHOD_(void, FireEventAsync)(THIS_ IEvtArgs *e) OVERRIDE;
136
137 /**
138 * @brief 注册一个处理通知的对象
139 * @param slot 事件处理对象
140 * @return 成功返回TRUE,失败返回FALSE
141 */
142 STDMETHOD_(BOOL, RegisterEventMap)(THIS_ const IEvtSlot *slot) OVERRIDE;
143
144 /**
145 * @brief 注销一个处理通知的对象
146 * @param slot 事件处理对象
147 * @return 成功返回TRUE,失败返回FALSE
148 */
149 STDMETHOD_(BOOL, UnregisterEventMap)(THIS_ const IEvtSlot *slot) OVERRIDE;
150
151 /**
152 * @brief 在UI线程中运行一个可运行对象
153 * @param pRunnable 可运行对象
154 * @param bSync 同步执行标志
155 */
156 STDMETHOD_(void, RunOnUI)(THIS_ IRunnable *pRunnable, BOOL bSync) OVERRIDE;
157
158 /**
159 * @brief 在UI线程中运行一个函数
160 * @param fun 函数指针
161 * @param wp WPARAM参数
162 * @param lp LPARAM参数
163 * @param bSync 同步执行标志
164 */
165 STDMETHOD_(void, RunOnUI2)(THIS_ FunRunOnUI fun, WPARAM wp, LPARAM lp, BOOL bSync) OVERRIDE;
166
167 public:
168#ifdef ENABLE_RUNONUI
169 /**
170 * @brief 在UI线程中同步运行一个闭包
171 * @param fn 闭包函数
172 */
173 void RunOnUISync(std::function<void(void)> fn);
174
175 /**
176 * @brief 在UI线程中异步运行一个闭包
177 * @param fn 闭包函数
178 */
179 void RunOnUIAsync(std::function<void(void)> fn);
180#endif
181
182 protected:
183 /**
184 * @brief 触发事件
185 * @param e 事件参数对象
186 */
187 virtual void OnFireEvent(IEvtArgs *e);
188
189 /**
190 * @brief 触发多个事件
191 */
192 virtual void OnFireEvts();
193
194 tid_t m_dwMainTrdID; // 主线程ID
195
196 SList<IEvtSlot *> m_evtHandlerMap; // 事件处理对象列表
197
198 SNotifyReceiver *m_pReceiver; // 通知接收器
199
200 SCriticalSection m_cs; // 临界区对象
201 SList<IEvtArgs *> m_ayncEvent; // 异步事件列表
202 BOOL m_bRunning; // 运行状态标志
203 int m_nInterval; // 事件处理间隔时间(毫秒)
204
205 SList<SAutoRefPtr<IRunnable>> m_asyncRunnable; // 异步可运行对象列表
206};
207
208template <class T>
214
215template <class T>
221
222SNSEND
223
224#endif // __SNOTIFYCENTER__H__
Header file for SCriticalSection and SAutoLock classes.
Pseudo-Singleton Template.
通过类成员函数回调的槽函数类模板
Definition SEventSlot.h:168
Wrapper class for a critical section.
SEventSet(void)
构造函数
void FireEventAsync(IEvtArgs *e) OVERRIDE
触发一个异步通知事件
void RunOnUI2(FunRunOnUI fun, WPARAM wp, LPARAM lp, BOOL bSync) OVERRIDE
在UI线程中运行一个函数
BOOL RegisterEventMap(const IEvtSlot *slot) OVERRIDE
注册一个处理通知的对象
void FireEventSync(IEvtArgs *e) OVERRIDE
触发一个同步通知事件
void RunOnUIAsync(std::function< void(void)> fn)
在UI线程中异步运行一个闭包
void RunOnUI(IRunnable *pRunnable, BOOL bSync) OVERRIDE
在UI线程中运行一个可运行对象
void RunOnUISync(std::function< void(void)> fn)
在UI线程中同步运行一个闭包
BOOL UnregisterEventMap(const IEvtSlot *slot) OVERRIDE
注销一个处理通知的对象
static SNotifyCenter & getSingleton(void)
Definition SSingleton2.h:59
TAutoEventMapReg()
构造函数,自动注册事件映射
~TAutoEventMapReg()
析构函数,自动注销事件映射
BOOL OnEvent(IEvtArgs *e)
处理事件
void registerNotifyCenter()
注册事件映射
void unregisterNotifyCenter()
注销事件映射
通知回调接口
virtual void OnFireEvts()=0
触发多个事件
virtual void OnFireEvent(IEvtArgs *e)=0
触发事件