nim_duilib/base/framework/message_pump.h

64 lines
2.7 KiB
C
Raw Normal View History

2019-04-19 17:19:57 +08:00
// The base class of a cross flatform message pump implemention
#ifndef BASE_FRAMEWORK_MESSAGE_PUMP_H_
#define BASE_FRAMEWORK_MESSAGE_PUMP_H_
#include "base/base_export.h"
#include "base/base_config.h"
namespace nbase
{
class TimeTicks;
// MessagePump用于驱动各种类型的消息循环比如UI消息、IO消息等因此可以派生为UIMessagePump、IOMessagePump等等。
//
// MessagePump有三种状态即任务状态、空闲状态、睡眠状态。MessagePump提取并处理了消息、Delegate处理了即时任务或定时任务,
// 那么MessagePump便处于任务状态。当MessagePump不处于任务状态并且Delegte处理了闲时任务那么MessagePump处于空闲状态。当
// MessagePump没有任何消息和任务需要处理的时候便会进入睡眠状态以节省CPU消耗。
//
// 处于任务状态的MessagePump在每一轮处理完毕后会立即尝试开始新一轮处理如果新一轮没有消息和即时、定时任务需要处理那么
// 会尝试开始处理闲时任务,如果有闲时任务需要处理,那么便进入空闲状态,如果没有,那么便会进入睡眠状态。进入空闲状态后,
// 如果新的消息到达或者有新的即时、定时任务被处理,那么立即切换成任务状态;如果空闲状态下没有新的空闲任务需要处理,那么
// 便进入睡眠状态。处于睡眠状态的MessagePump可以被ScheduleWork、ScheduleDelayedWork等唤醒进入任务状态。
class BASE_EXPORT MessagePump
{
public:
// Delegate是一个回调类让MessagePump给机会利用它处理其他任务。
// DoWork用来处理即时任务这类任务需要尽可能快地被开始处理
// DoDelayedWork用来处理定时任务这类任务在特定时刻被处理next_delayed_message_time为下个任务执行的时刻
// DoIdleWork用来处理闲时任务这类任务在MessagePump处于空闲状态时被处理
// 三者返回值意义类似返回true表示处理了该类任务返回false表示没有该类任务需要处理
class BASE_EXPORT Delegate
{
public:
virtual ~Delegate() {}
virtual bool DoWork() = 0;
virtual bool DoDelayedWork(TimeTicks *next_delayed_message_time) = 0;
virtual bool DoIdleWork() = 0;
};
MessagePump();
virtual ~MessagePump();
// 启动消息循环
virtual void Run(Delegate* delegate) = 0;
// 通知退出消息循环
virtual void Quit() = 0;
// 通知MessagePump处理即时任务
// 可以跨线程调用这个接口
virtual void ScheduleWork() = 0;
// 通知MessagePump处理定时任务
// 此接口不允许跨线程调用
virtual void ScheduleDelayedWork(const TimeTicks& delay_message_time) = 0;
};
} // namespace nbase
#endif // BASE_FRAMEWORK_MESSAGE_PUMP_H_