用于数据采集和绘图的单独线程

时间:2011-10-19 07:36:49

标签: c linux multithreading

我有一个用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循环中,所以是的,线程?

感谢。

2 个答案:

答案 0 :(得分:1)

小心!您的绘图程序平均可以保持数据到达串行端口的速率吗?如果没有,xyz会发生什么?是否应覆盖未绘制的值或其他内容?如果你跟不上,这个问题需要先回答。

如果你能保持平均水平,那么正如你所说,你在低级(即线程)编程方面缺乏经验,你可以考虑使用由shell管道连接的两个进程:

poll_for_serial_data | plot_data

第一个进程是你的while循环,以一种方便的格式将轮询数据写入stdout。第二个进程从stdin读取dat并绘制它。这实现了与多线程方法相同的结束,但由于操作系统为您处理同步和保护问题,因此更简单,更容易编写。在Linux上它非常有效。

如果这对您来说不够高效,它仍然可以作为多线程版本的模型。

答案 1 :(得分:0)

是的,这是要走的路。非主线程是数据获取线程,它将缓冲的响应发布到执行绘图的主/ UI线程。主线程应使用此数据进行绘图。