完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
最近看到去了一篇博客,亲手试验了一遍,对其中一个不甚理解,翻来覆去想好了好久,不得其解,只好求助于各位高手,博客地址如下:http://blog.csdn.net/ap0108220/article/details/16842267,其中那个“为什么在WHILE循环中使用事件结构时,停止按钮需要按两次才能结束?”很难想明白,先求助于各位(自己加了一个显示,方面跟踪事件结构)。
|
|
相关推荐
18个回答
|
|
wangyi31 发表于 2016-12-21 14:15 1.不是,此时labview已经读取过一次控件的值了,确切的说在你还没按按钮的时候就已经读取过控件值了,读到的值是“假”。 2.自动弹回是这个按钮的机械动作,并不代表labview已经读取了控件值。按钮按下去再自动弹回的时候labview会把值“真”锁存起来了,以保证下次程序里读取按钮值的时候能读到真值,但这跟你的程序有没有读取控件值是两回事。
最佳答案
|
|
|
|
|
|
执行过程如下: 1.第一次进入循环,按下按钮之前程序就已经读取了按钮的值,为假。 2.第一次按下按钮之后,触发事件结构,执行完事件结构以后,本次循环就结束了,第1步时已经说了,这时候读到的按钮值是假,所以循环并不会停止,而是会开始第二次循环。 3.进入第二次循环:程序首先读取按钮的值,因为前面已经按过一次按钮了,所以这时候读到的按钮值是“真”(这里有一个知识点,是关于按钮的机械动作的,默认从while循环红点处创建的这种按钮是触发型的,带有锁存功能,只要按过一次按钮,labview下次读到的值就是“真”,读到这个“真”值以后,在下次再按下按钮以前读到的值都是“假”,这样可以防止labview漏掉真值的读取,注意并不是所有的布尔都是这样的,只有触发型的按钮才有这个特性)。接上面的继续说,读到“真”值以后,循环不会马上结束,因为事件结构还在等待中,这时候只要让事件结构执行完循环就可以结束了,也就是说如果你还有另一个按钮也做了事件的话,只要你按一下那个按钮触发事件,程序就会结束了,不一定非得按停止按钮。 建议采用如下方式来停止循环,事件结构的超时最好还是加上,你可以在超时分支里做些别的事情。
|
|
|
|
|
|
你的stop按钮应选择如图所示的 switch until released,就可以实现按一下就停止程序
|
|
|
|
|
krize 发表于 2016-12-21 11:21 首先谢谢您的回答,还有些疑问,比如:1:我按下停止按钮后,触发了事件,此时labview检测到了停止按钮数值的变化,处理了“加1”事件,此时labview是还没有读取控件的值是吗。2:我注意到,停止按钮按下一次后,他又自动弹回了,应该是labview已经读取控件的值了,此时值为1啊,为什么没有停止,就是要按第二次始终不明白? |
|
|
|
|
|
其实是执行的先后顺序的问题,循环一进入,由于事件结构处于等待,而停止按钮已经赋值给循环端子(因为程序一运行就赋值了,你再按停止按钮才执行事件结构),所以看似同时执行却是先执行停止按钮的赋值,再等你按了停止按钮后才触发事件结构,所以第一次按停止按钮只是触发事件结构而已,并非把真值赋给循环端子。第二次进入循环端子才把停止赋值,但是事件结构未响应无法退出循环,所以这时你要再次按停止按钮(这次纯粹是让事件结构响应)。比较好的理解就是把停止按钮放到停止事件里,这样才是严格的停止与事件同时发生,循环立刻停止(这里可以观察循环次数为0代表只循环一次)
|
|
|
|
|
|
|
|
|
|
|
krize 发表于 2016-12-21 14:53 沙发讲的很详细了,数据就是按照这样的罗技流动的 |
|
|
|
|
wangyi31 发表于 2016-12-21 14:15 自动弹回是机械动作决定的 |
|
|
|
|
wangyi31 发表于 2016-12-21 14:15 其实labview有个强大的功能就是看数据流动,你把程序框图上的小灯泡打开,运行,就可以直观的看到数据流动以及执行的先后顺序了,另,沙发说的很明白 |
|
|
|
|
静夜style 发表于 2016-12-21 16:54 谢谢您的耐心回到,我按照您的说法做了一下,我按下第一次的时候,看了一下,过程是这样的:首先事件结构由于按键的值改变,触发了事件, 显示值加1 ,labview读取了按键的值,为“T”,我的疑问既然读取的值为“T“了,为什么循环还要进行下去,是要将本次循环进行完毕算结束吗? |
|
|
|
|
静夜style 发表于 2016-12-21 16:54 谢谢您的耐心回到,我按照您的说法做了一下,我按下第一次的时候,看了一下,过程是这样的:首先事件结构由于按键的值改变,触发了事件, 显示值加1 ,labview读取了按键的值,为“T”,我的疑问既然读取的值为“T“了,为什么循环还要进行下去,是要将本次循环进行完毕算结束吗?
|
|
|
|
|
|
跟着楼主一起学习一下
|
|
|
|
|
wangyi31 发表于 2016-12-21 17:58 这样讲吧,在你没有按下按钮执行程序的时候,你有没有发现for循环先执行了一次?在执行第一次循环的时候事件结构由于没有接收到按钮值改变事件,你就可以看到按钮的f值传给了结束条件。你想一下,为什么我并没有按下按钮,按钮的值也会被传递出去呢?(事件结构是阻塞型的,一般情况下,会理解为事件结构如果不执行,那么程序会阻塞在这里),这种情况出现的原因就是labview是一种自动多线程的语言,所有单一的数据流都被自动认为是一个单独的线程,在这里,按钮和事件结构没有显式的用线段连接,所以就成了隐形的2线程,所以在事件结构阻塞住循环的时候,按钮的值可以送到判断条件处。但是一次循环内,必须要等到所有语句都结束才会结束第一次循环,而labview的while循环是在最后才判断循环结束条件的,而且为了保护用户数据不丢失,就像之前另一位大神说的,循环像一个D触发器一样保留值,这样就出现了点击第二次按钮才能结束循环的现象,解决方法就是把按钮放到事件结构体内部就行。
|
|
|
|
|
|
本帖最后由 静夜style 于 2016-12-22 16:09 编辑
wangyi31 发表于 2016-12-21 17:58 第一次写了一大推没发出去,重新写一遍。 这里涉及到几个labview的特性:1,自动多线程,你看我的截图就明白了,在没有数据线显式的连接的控件就会被隐式的转换成“多线程”(事件结构和另外3个控件之间变成了“两个线程”,打引号是因为并不真的是两个线程,但是有多线程的特性),你看到的假如什么都不做,循环结束条件还是接受到按钮的F值; 2,while循环无论如何都会执行至少一次,和其他语言不同,while判断条件结束是在循环体内所有数据都流到最后才进行判断; 基于以上两点,在没有按按钮的时候,没有触发事件,但是循环结束条件已经提前接收到了F值,但是事件阻塞不能进行下一次循环;等到按钮按下之后,事件结构执行完,此时循环结束条件判断的是F值,但是按钮值已经改变为T,所以在下一次循环结束时判断的才是第一次按钮产生的T值。
|
|
|
|
|
|
补充一点,因为按钮没有按下,所以第一次读到的是F值,(”多线程“导致按钮的值先事件结构被送到结束条件,所以第一次循环读取按钮值已经结束,所以你按按钮也不能结束循环,对,就是时序问题,你只要想办法让读取按钮的值在触发事件结构之后就不会导致这样的现象出现,所以如2楼所言,把按钮放到事件结构里面就好了)
|
|
|
|
|
静夜style 发表于 2016-12-22 16:13 谢谢您的耐心回答! |
|
|
|
|
|
补充一点,因为按钮没有按下,所以第一次读到的是F值,
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
请教大神,在labview里面对实时扫描资源中的C系列模块NI9234进行配置发生非预期错误
1671 浏览 0 评论
1569 浏览 0 评论
LABVIEW 2023 Q1调用python后一直报错1671
1946 浏览 2 评论
5094 浏览 3 评论
4986 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 21:32 , Processed in 1.002981 second(s), Total 114, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3531