c++ - 确保 C++(数字图像处理)程序和使用文件的处理程序之间的成功通信

标签 c++ image-processing operating-system processing file-handling

OBJECTIVE :- 实现 arduino 和 C++ 程序之间的串行通信。我将处理用作中间程序,它对数据执行一些操作,然后将这些值串行传递给 arduino!

我有一个 C++ 程序,它定期将数据写入文件,比如 UFR,90,87 每 30 毫秒写入一个文件。正在写入的文件以截断模式完成,即文件每 30 毫秒被覆盖一次。

接下来,有一个处理代码必须在文件写入后立即从文件中获取该值。先执行 C++ 代码,然后再执行处理代码。处理代码使用 BufferedReader 读取文件内容。

我应该如何在两个程序之间启用同步,以便处理代码同时读取 C++ 程序刚刚写入的值(轻微滞后,小于 5-10 毫秒是可以接受的)并且有完美的同步?不应该有任何错误的沟通。 我是否应该在连续读/写之间对文件建立某种互斥锁/信号量/其他东西?

此外,我正在从终端运行 C++ 程序,并从处理 IDE (GUI) 运行处理代码。使用的操作系统是 Ubuntu 14.04/CentOS 7 Linux。

另外,需要建议:- 请问有没有人建议我在 arduino 和 C++ 程序之间建立直接通信的更好方法。我能够通过直接传输成功传输数据,但是没有从 arduino 正确接收到确认。我们也必须收到来自 arduino 的确认,它无法确认数据已成功接收。我尝试使用 GNU 屏幕模拟器发送数据,但它没有确认收到的数据。因此,我不得不使用这种使用 Processing 的中间方法!

最佳答案

如果这两个程序要以这样的锁定步骤运行,并且如果不需要数据持久性,那么也许可以探索其他一些 InterProcessCommunication (IPC) 原语 - 例如管道、套接字、消息、共享内存。

在基于文件的方法中,您已经回答了自己的问题。使用信号量;它们很简单。您的生产者检查计数是否为 0;如果不等待;生产;设置信号量;消费者测试它是否为 1;如果不等待;消费;重置信号量。

If you need produce irrespective of whether or not the previous production has been consumed or not, use mutexes; the ones that work cross process. Lock - write into file - unlock; consumer: lock - read - unlock.

Linux 不是实时系统,因此无法保证您的消费者会在消费者完成后的 5-10 毫秒内被唤醒;但是 5-10 毫秒就足够“长”了;或者可能不是。该线程表明时间片的数量级为 100 毫秒 - How to know linux scheduler time slice? .如果是这种情况,那么您的使用者线程可能需要等待一段时间,如果其他线程先被调度,则需要等待 5-10 毫秒以上。将您的消费者线程优先级设置为高值可以缓解部分问题。它将确保这一点——生产者生产、 sleep 、操作系统寻找下一个任务、找到您的消费者任务,这些任务现在已经变得可运行并且处于非常高的优先级。在这一点上,纯粹主义者会告诉你,没有这样的保证,还有其他因素在起作用。

在网上搜索“生产者消费者问题”也会给您很多其他想法;大多数是同一基本思想的变体。

关于c++ - 确保 C++(数字图像处理)程序和使用文件的处理程序之间的成功通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28494823/

相关文章:

java - 将图像的色彩空间从 RGB 转换为 HSV

java - 将给定 "type"文件中的图像加载到 OpenCV Mat 中?

linux - 页表项中的可执行位在哪里?

file - 为什么文件句柄是如此昂贵的资源?

c++ - 如何在头文件中声明类型转换并在cpp文件中实现?

c++ - C++ 中 ## 运算符的用途是什么,它叫什么?

python - 尝试在opencv python中获取轮廓区域时出错

c - bss 和数据段中的整数变量大小

C++ 代码不在同一行中显示输出

c++ - TreeMap : drawing elements which might explode