本文覆盖 src/op/EventMgr.h 中的 EventMgr、TimerMgr、OTAEvent,以及三个快捷宏。说明依据 EventMgr.cpp 和 internal/EventHelper.cpp 的当前实现整理。
#include "op/EventMgr.h"
using namespace stt;
using namespace stt::op;
using namespace stt::data;
EventMgr 是进程级单例。构造时会启动一个 detach 的无限后台线程,用于刷新绑定视图及约每 60 秒提交事件数据库事务。因此必须先完成 Runtime、默认数据库、变量管理器和事件定义初始化,再首次调用 getInstance。
EventMgr* events = EventMgr::getInstance(getRuntime());
events->load();
当前析构与 destroy 不会停止该后台线程。Runtime 和数据库对象必须比 EventMgr 的工作线程存活更久。
| 分类 | API |
|---|---|
| 单例与加载 | getInstance、load、destroy |
| 控件绑定 | bind、bind2、rebind、release、drawData |
| 事件控制 | pause、resume、isPaused、setACCT、setACCE |
| 显示配置 | setDateMode、setDurationUnit、颜色和字体查询 |
| 确认 | confirm、confirm2、confirmEvent、confirmWarn、setConfirmEID、getConfirmEID |
| 导出 | exportCSV 三组重载 |
| 删除 | deleteDB 两组重载、deleteExpiredDB |
| 数据库 | getdb、commitThenBeginTrans |
static EventMgr* getInstance(IRuntime* rt);
首次 rt 生效。构造函数虽然只在部分位置检查数据库是否为空,后续仍会解引用数据库指针,所以不要用空 Runtime 或未初始化数据库调用。
bool load();
load 会读取事件定义、创建事件处理器,并在数据库中重置累计次数、累计时间和状态,再重建运行状态。RVAR 为空的事件定义会被跳过。
EventMgr* mgr = EventMgr::getInstance(getRuntime());
if (!mgr->load()) {
// 检查默认数据库和事件定义
}
不要在页面切换时重复 load;它不是普通的“刷新显示”操作。
void pause(const string& eid = "");
void resume(const string& eid = "");
bool isPaused(const string& eid);
mgr->pause("12"); // 暂停指定事件
mgr->resume("12");
mgr->pause(); // 空字符串作用于全部事件
mgr->resume();
isPaused 返回 false 既可能表示事件正在运行,也可能表示 EID 不存在。需要先保证 EID 来自有效事件定义。
void setACCT(const string& eid, unsigned long long acct);
void setACCE(const string& eid, int acce);
分别设置指定事件的累计时间和累计次数。只更新已加载的事件处理器及其可选绑定变量,没有返回状态。
bool bind(
STTWidget* widget,