本文说明 src/op/DataSample.h 中的 SampleMgr 与 ExportSampleAndEventHelper。内容同时核对了 DataSample.cpp 的当前实现,因此“实现注意”比头文件注释更接近实际运行结果。
命名空间为 stt::op,常用数据类型位于 stt::data。使用前必须保证 IRuntime、默认数据库、变量管理器和采样定义已经初始化。
#include "op/DataSample.h"
using namespace stt;
using namespace stt::op;
using namespace stt::data;
SampleMgr 是进程级单例。第一次调用 getInstance(rt) 时传入的运行时对象会被保存,后续传入其他 rt 不会替换它。因此应在应用运行时稳定后初始化一次,并确保 rt 的生命周期覆盖所有采样任务。
| 方法 | 作用 | 关键返回值或行为 |
|---|---|---|
| getInstance | 获取单例 | 首次传入的 IRuntime 生效 |
| allSamples | 查询全部采样定义 | 返回 SID、SNAME、STBL 表 |
| pause / resume | 暂停或恢复采样 | 空 SID 表示全部 |
| deleteDB | 删除日期范围内的数据或数据库文件 | 破坏性操作 |
| getExportResult | 取得最近一次异步导出结果 | map<文件名, 状态文本> |
| isExporting | 查询导出线程状态 | 无锁读取共享状态 |
| deleteExpiredDB | 清理过期的分日数据库 | 内部接口,有两个重载 |
| destroy | 清理静态容器 | 不会删除并重置单例 |
| lock / unlock | 锁定或解锁实时采样表 | 必须严格成对 |
| locknav / unlocknav | 锁定或解锁历史导航 | 必须严格成对 |
| setFactorAndOffset | 设置变量换算 | 采样值 = 实际值 × factor + offset |
| get | 获取实时表或历史视图 | 实时结果为借用指针,历史结果为新对象 |
| load | 加载并启动采样任务 | 延时最少 5 秒 |
| bind | 绑定采样数据到控件 | 当前仅真正支持 STTTable |
| exportCSV | 异步导出采样数据 | 路径与平台有关 |
static SampleMgr* getInstance(IRuntime* rt);
推荐在页面或业务对象初始化时保存指针:
SampleMgr* samples = SampleMgr::getInstance(getRuntime());
if (samples == nullptr) {
// 运行时尚未准备好
return;
}
不要用不同 Runtime 反复调用并期待切换运行环境。当前实现只在首次创建单例时记录 rt。
static TTable allSamples();
返回表包含 SID、SNAME、STBL。适合填充采样选择列表:
TTable defs = SampleMgr::allSamples();
for (int row = 0; row < defs.getRowCount(); ++row) {
string sid = defs.getValue(row, 0);
string name = defs.getValue(row, 1);
string table = defs.getValue(row, 2);
// 展示或缓存定义
}
默认数据库未初始化时不能可靠调用。
bool load(int delay = 5);
load 从数据库读取采样定义并建立处理器。delay 单位为秒,小于 5 的值会被提升到 5。当前实现最终总是返回 true,不能仅凭返回值判断每条定义是否加载成功。
定义中的 MODE 位含义:
| 位 | 含义 |
|---|---|
| bit 0 | 0 为周期采样,1 为触发采样 |
| bit 1 | 置位时加载后自动启动 |