我有一个用C语言编写并在Linux上运行的程序,它每隔16个左右从串口设备获取流数据。这是一段时间关键的代码,工作正常。另一段代码也会实时绘制这些数据,但它的及时执行对我来说不如数据采集部分重要。也就是说,在再次轮询串口之前,我不想等到所有绘图和绘图功能都完成。所以我在考虑让一个单独的线程做一个应用程序的绘图部分,或者让数据获取部分成为单独的线程。在低级编程方面我真的没有经验,所以有人能指出我正确的方向吗?我正在使用的伪代码看起来像这样:
int xyz; // global variable
int main() {
do_some_preliminary_stuff();
while 1 {
poll_serial_port_and_fill_xyz_with_new_position_and_repeat();
}
while 1 {
plot_xyz();
}
return 0;
}
显然,正如所写,代码将被卡在第一个while循环中,所以是的,线程?
感谢。
答案 0 :(得分:1)
小心!您的绘图程序平均可以保持数据到达串行端口的速率吗?如果没有,xyz会发生什么?是否应覆盖未绘制的值或其他内容?如果你跟不上,这个问题需要先回答。
如果你能保持平均水平,那么正如你所说,你在低级(即线程)编程方面缺乏经验,你可以考虑使用由shell管道连接的两个进程:
poll_for_serial_data | plot_data
第一个进程是你的while循环,以一种方便的格式将轮询数据写入stdout。第二个进程从stdin读取dat并绘制它。这实现了与多线程方法相同的结束,但由于操作系统为您处理同步和保护问题,因此更简单,更容易编写。在Linux上它非常有效。
如果这对您来说不够高效,它仍然可以作为多线程版本的模型。
答案 1 :(得分:0)
是的,这是要走的路。非主线程是数据获取线程,它将缓冲的响应发布到执行绘图的主/ UI线程。主线程应使用此数据进行绘图。