松江专业做网站,代驾软件系统多少钱一套,做混剪素材下载网站,滨州网站建设制作系统老套路#xff0c;一图胜千言#xff0c;框图可能有点随意#xff0c;后面我会解释 先描述下背景#xff0c;在Modbus线程内有一个死循环#xff0c;一直在读8个线圈的状态#xff0c;该线程内读到的消息会直接发送给UI线程#xff0c;UI线程会解析Modbus数据帧#xf…老套路一图胜千言框图可能有点随意后面我会解释 先描述下背景在Modbus线程内有一个死循环一直在读8个线圈的状态该线程内读到的消息会直接发送给UI线程UI线程会解析Modbus数据帧然后拿到8个布尔值如果发现M1的值为true就发送置位信号该信号连接到了Modbus线程其实就是将一个置位命令添加到队列。 ModBus线程一直也在判断队列是否为空如果不为空就发送置位数据帧且本次循环略过发送读取状态的命令因为判断用户队列和读取状态的代码块是if else的关系最后呈现的现象是每次都会收到两次置位信号有时甚至是三次经过一天半的折腾各种打日志分析加互斥量加标志位我认知范围内的办法上齐了依然解决不了。后来通过打印每个消息发送的时间大概猜到了问题就是说当Modbus线程接收到数据帧会马上发送给UI线程但是在死循环下一个周期的时候判断队列依然是空的于是它又读了一次又发送了一次数据帧直到死循环的第三个周期才判断到队列内有命令了然后才发送了置位信号所以呈现出的现象就是读到了两次置位信号其实为题就出在我在Modbus线程接收到数据后并没有处理而是原封不动的发给了UI线程等UI线程处理完添加命令到队列的时候Modbus线程的死循环已经又跑了一次了就造成了这个现象。后来通过加标志位的方式解决了这个问题。