labview 的生产者与消费者结构问题

2019-07-17 08:19发布

今天在学习生产者,消费者结构,遇到个问题:
当按主循环中的“停止”按键,后面两个子程序能够正常关闭。
当按子程序2的“停止”按键,子程序1和子程序2也能正常关闭。
但是当我按子程序1的”停止“按键时,只能把子程序1关闭,另外2个都不能正常停止,最让人奇怪的是当我把子程序2高亮显示的时候,再去点击子程序1的”停止“按钮,后面两个子程序又可以正常关闭了。
万能的”电子发烧友“啊,请帮忙指点迷津呀。




我保持了低版本的程序!!!!!
154331pyzgdb7r1p52r7jo_jpg_thumb.jpg
154339wy4z9eb79bh6uvbh_jpg_thumb.jpg
生产者消费者高级应用 文件夹.zip 下载积分: 积分 -1 分
131.53 KB, 下载次数: 152, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
gswanybz123
2019-07-17 09:24
1.按主程序的停止后会向Q1、Q2队列发exit命令使两个子VI的接收处理循环停止。这个没问题;
2.按Q2停止时,Q2内的接收处理循环正常停止,同时主程序事件结构停止,主程序继续执行接收处理循环到“待处理队列MAIN”子VI后会因为全局变量往队列丢入exit命令,执行后停止本身循环同时通知Q1停止。这个也没问题;
3.按Q1停止时,主程序、Q1、Q2的事件循环由于全局变量全部停止,Q1的接收处理循环也正常停止,接着主程序里的接收处理循环同第2点一样也会自发停止,同时向Q1、Q2发送exit命令。那么问题来里,Q1已经停止了,给Q1发exit指令报错,接着错误传给后一个向Q2发命令的VI,因为错误所以不会执行,Q2就没拿到那个exit命令,就悲剧的死等了。
4.高亮时候为什么行昵,因为Q2的那个exit命令是它自己的接收处理循环处理第一个指令时,刚好运行到“待处理队列MANI”VI,此时全局变量已经改变,自己给自己队列丢了个exit,所以能停止。

综上,Q2要能停止,要么接受主程序丢入的exit命令,要么自己因为任意命令处理循环运行到“待处理队列MANI”VI自发给自己一个exit命令。但是Q1停止时,主程序发的命令错误来不了,自己又没有执行的机会。明白了吧。

一周热门 更多>