【问题标题】:Producer/Consumer For Talking to Devices Serially与设备串行通信的生产者/消费者
【发布时间】:2011-01-06 14:54:22
【问题描述】:

这是我的问题:我必须能够通过串行向设备发送和接收。这必须以多线程方式完成。流程如下:

  1. 等待设备向我发送内容 - 或者如果空闲,则查询状态以查看设备是否在线

  2. 如果设备向我发送了某些内容,则处理消息、确认并告诉设备在必要时执行其他命令

现在,我有一个接收线程和一个发送线程。接收线程有一个 while 循环,它通过 ReadFile(...) 不断检查串行端口的一个字节。如果我有一个字节,那么我开始构建我的缓冲区,然后解析数据以确定发送给我的内容。

发送线程接受读取线程定义的下一个命令,并通过 WriteFile 将其发送到同一个 COM 端口。关键是我自己和设备之间存在接收/发送关系。

我的问题是,我这里有嵌套的生产者/消费者模型吗?如果我的接收线程正在从设备消费,而发送线程正在向设备生产,那么线程需要固有地对话,以便它们是同步的,对吗?什么是同步我的努力以有效和快速地与设备交谈的最佳方式?注意:我使用的是 C++ Builder 5,它有 TThreads 并且可以使用临界区和互斥锁。

编辑:我也在使用轮询,所以我也愿意使用 WaitCommEvent,如果这样会更好的话!

【问题讨论】:

    标签: c++ windows multithreading c++builder


    【解决方案1】:

    您正在共享哪些您认为需要同步的资源?

    如果您在两个线程之间有类似队列的东西,那么这是一个非常经典的生产者/消费者模型。例如。如果您只有一个线程读取然后将命令放入队列,而另一个线程从队列中提取,处理命令并写入设备,那么您需要使用互斥锁或信号量同步对队列的访问。

    也许我遗漏了一些东西,但这只会在您有多个线程从队列中读取并且需要传输的命令需要保持有序时才会变得复杂。所以尽量保持简单。

    【讨论】:

    • 对,但是如何同步对设备的访问,以便在阅读时不写作?全局标志?
    • 您确定必须这样做吗?如果是这样,您可以使用信号量来同步读/写操作。这个stackoverflow.com/questions/1488712/… 可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多