监视项目,16个传感器,采样频率50Hz,Oracle数据库,具有简单的结构:record_time Sensor_data。
Create Table real_data(
record_time timestamp(3),
ac_1 Float,
ac_2 Float,
ac_3 Float,
ac_4 Float,
ac_5 Float,
ac_6 Float,
ac_7 Float,
ac_8 Float,
ac_9 Float,
ac_10 Float,
ac_11 Float,
ac_12 Float,
ac_13 Float,
ac_14 Float,
ac_15 Float,
ac_16 Float
)
Tablespace data_test;
我使用LiveCharts WPF控件读取数据库,显示实时曲线。
要求:20ms显示数据,曲线向左移动,没有显示暂停。
现在读取数据库的两种方法:
常规刷新
Timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(1000) };
问题是1秒的间隔,读取数据库中最新的1秒数据(大约50个数据),曲线有暂停(每1秒偏移一次);转移到20ms刷新,读取最新数据并在曲线之后插入,多次读取相同的数据,因为数据库查询时间为100ms左右(选择顶部),导致很多直线曲线,不符合变化的实际趋势。
- 使用线程,特别是线程来读取数据库,选择启动时间,偶尔会暂停分析的原因:读取数据的时间通常为20ms,偶尔是300ms,因为那里的数据库经常进行插入和删除,而操作系统内存也是实时更改,将影响阅读速度。而且时间越长,曲线延迟就越严重。
是否可以通过数据库显示高频数据以读取方式是不可行的吗?仅通过直接读取设备API可行?
谢谢!
您要问的,如何更快地刷新图表,而不是暂停数据库。我不是技术专家,但我知道一个"作弊"可能对您有用。而不是在图表上显示当前值,而是显示一秒前的值,基本上是缓冲。
因此,想法是您有一个线程,每500ms读取数据,然后将读取数据存储到内存中。然后,您将有另一个用于图表更新的线程,该线程每20ms每20ms从内存中进行一个结果集并绘制它。这将使图表看起来平稳且没有暂停,数据曲线也将是准确的。唯一的回报是,该图表没有显示"实时"数据,而是500ms以前的数据的延迟版本。
这就是我的意思:
0秒 - 传感器开始,图表上没有视觉
0.5秒-25个数据集中的数据集,查询db(选择1〜25),图表上没有视觉
1秒-50个数据集中的数据集,查询db(选择26〜50),在接下来的500ms上开始在图表上显示结果1〜25。
1.5秒-75个数据集中的数据集,查询db(选择51〜75),开始在下一个500ms上在图表上显示结果26〜50。