找回密码
 注册
LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2412|回复: 15

一个小问题,数据不同步

[复制链接]
发表于 2008-4-29 10:06:07 | 显示全部楼层 |阅读模式
程序在附件中,现在遇到了一个问题,就是程序打开,大家可以高亮显示,第一次运行时,会发生错误,因为除数的值只有在第二次点击确定按钮时才会传过来,为什么第一次运行时,只有被除数的值传过来而除数的值传不过来呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2008-4-29 10:09:24 | 显示全部楼层
求助贴如果没有必要,最好用低版本的labview来写。这样能得到更加广泛的帮助。现在用8.5的,实在很少
回复 顶

使用道具 举报

 楼主| 发表于 2008-4-29 11:03:33 | 显示全部楼层
前辈说的 极是,我下了一个7.0的,又用7.0做了一个,前辈看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

 楼主| 发表于 2008-4-29 11:06:03 | 显示全部楼层
数值输入控件我把增减量按钮给去了,然后手动输入,程序运行,就出现问题了,但是有增减量按钮时,通过增减量按钮进行值输入时就i没有这种情况了。
回复 顶

使用道具 举报

发表于 2008-4-29 11:51:12 | 显示全部楼层
你的还是8.5的,或者给我个贴图也可以
回复 顶

使用道具 举报

 楼主| 发表于 2008-4-29 12:26:18 | 显示全部楼层
,前辈,太不好意思了,好的,框图和前面板如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

发表于 2008-4-29 12:32:48 | 显示全部楼层
输入数据之后,它的值并没有改变,而是需要在其它地方点击一下,才可以。
回复 顶

使用道具 举报

 楼主| 发表于 2008-4-29 13:37:28 | 显示全部楼层
前辈,我还是给发程序吧
回复 顶

使用道具 举报

 楼主| 发表于 2008-4-29 13:45:55 | 显示全部楼层
前辈请看看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

发表于 2008-4-29 14:13:51 | 显示全部楼层
我7楼说了啊,你输入数据之后,要在别的地方,比如空白地方点击下,然后才能去点按钮的,labview把数据控件做出来,本身可能并不想用户去输入数据的,直接点increment/decrement就可以了。。。。。。

如果你觉得这样操作麻烦,你可以用string控件来做输入,右击控件,选中update while typing,在后面板把字符串形式的数据转化为相应的10进制数,再做你的运算
回复 顶

使用道具 举报

 楼主| 发表于 2008-4-29 14:35:18 | 显示全部楼层
高手, ,我说的不是这个意思,您老人家的意思小的明白,您老人家运行一下程序,是打开之后运行的第一次,给两个控件输入值,点击“OK”后,显示控件出现“-inf”,是因为除数的值没过来,还是0,所以就错误了
回复 顶

使用道具 举报

发表于 2008-4-29 16:52:59 | 显示全部楼层
恩,看来是我没说清楚,那么,下面我尝试着说清楚些。。。。

      labview程序,大体可以分为前面板和后面板。前面板是GUI交互的,比如一些数据的输入和显示的输出,而后面板执行一定的算法。

   一般来说,一个前面板control或者是indicator,都有一个重要的属性:value,用来代表这个control的值。比如你的程序里,numeric控件,它就有一个value值,这个值当然是放在内存中的。而你的程序的问题,就涉及到value更新的时机。

   那value什么时候更新呢?拿用键盘输入的这些控件来说,你按下按键了,控件的value是不会更新的,你一直敲击按键,一直给控件输入字符(数字、符号),但只要控件还有焦点,那它就是不更新value值。。。。。。。一直一直一直到,到什么时候呢?一直到控件失去焦点,它才会用前面板你输入的这些数据(同时也是你看到的数据),去更新value。

     什么叫做焦点?这个应该知道的了?焦点在控件上,就是说控件处于选中状态。好,那继续说。
     有了上面的认同,那我们来解释下你的问题。

     程序刚打开,两个numeric初始值为0。然后你在被除数那里,输入一个数字,在你输入数字的过程中,被除数输入控件(当然,这里就是numeric)拥有焦点,它不会去更新它的value,比如你要输入的数是123456,输入过程中,控件拥有焦点,那么,控件的value就保存它上一次的值没变,这里就是0。

     123456你输入完毕,想要在除数那里输入一个数值,比如是123,那么,一般来说,你会用鼠标把光标定位到numeric1的输入,这样一个动作,带来一系列影响:首先,numeric控件,也就是被除数输入控件,失去焦点;然后,labview程序检测到有控件从原先拥有焦点到失去焦点这样一个变化,那就更新该控件的value,所以,被除数的123456确实被labview所接受;最后,把光标定位到了numeric2控件输入。

     好,现在光标在numeric2,也就是说,你要对该控件进行数值输入了。比如你要输入123。前面分析过了,只要该控件拥有焦点,那么,numeric2的值就为原来的值(0)。你在输入123的过程中,numeric2的值为0。输入完毕。输入完毕了,接下来做什么?接下来。。。。。。

    接下来到了关键的地方!!!这个时候,你很可能再次拿起你那万恶的鼠标,去点击了确定按钮,触发按钮的mouse  down事件,执行事件处理程序,进行两个数相除。这个时候,被除数是123456,那么,除数是多少呢?是123?还是0?要看它的值,就要看,程序响应mouse down事件之前,numeric1控件有没有触发那么一个类似于lose focus的事件(当然,labview并没有这样一个事件?有吗?没有的吧?为什么不提供这么一个事件呢?可能NI的工程师认为lose focus的事件处理都是一样的,就是用前面板显示的值来更新该控件的value。显示的值???value???它们不是一样吗?不一样的吧?有疑惑回头看我前面写的,汗,写长了!所以,可以这么去猜测,lose focus的事件已经内置到labview里面去了,内置到哪里呢?不是有个GUI监控吗?估计就是到那里去了)

    回到刚才的问题,程序响应mouse down事件之前,有没响应numeric2的lose focus呢?恩,这个问题可能有点难了,我也不是很理解,所以说起来会有点模糊,如果不想看,直接跳过。。。。好,我尝试解释下。
    程序响应mouse down和labview自动处理numeric2的lose focus,哪个先发生?这就是涉及到程序优先级的问题。我们自己写的labview程序,后面板执行的优先级和labview自动处理GUI界面事件的优先级,哪个高?一般默认下,都是算法优先级(也就是后面的优先级)高,GUI优先级最低。那我程序默认优先级多少呢?可以这样去查看下:选择file-->vi properties-->excution,在界面右边,有个preferred excution system,大概就是优先级设置了(我也不确定的 ,不过基本可以这么理解),可以看到,user interface在最上面,接下来依次是:standard、instrument i/o、data acquisition,下面几个有点古怪,先不考虑。。。user interface当然就是GUI了,那么,它在最上面代表最高优先级还是最低优先级呢?我知道的是data acquisition优先级是相当的高的(不高的话,信号数据丢失怎么办?这就好像用单片机测脉冲,脉冲一般都是接到INT0中断的,因为它的优先级最高,保证不会丢失重要数据~~~)所以,user interface是最低的。


       那我们程序默认优先级是多少?想必刚才你打开到preferred excution system的时候,就看到程序的优先级被设置为same as caller。这个什么意思?那就是说,我这个vi的优先级和调用这个vi的vi(父vi)的优先级是一样的。而我们的vi是在最上层,没有谁去调用它,那它什么优先级呢?当然就是standard了,标准优先级!!!它比user interface要高。

    回到刚才那个问题:“程序响应mouse down和labview自动处理numeric2的lose focus,哪个先发生?”那你的回答是什么?当然是mouse down先发生咯!!!!mouse down事件处理程序里,你立马做除法运算,而这个时候,因为lose focus事件没有发生,除数为0,所以,结果就是Inf咯(不过为什么是-Inf呢?这个和数值表示有关,恐怕说不下了,而且我也没去分析过 )。

    哇,休息下,回头去看,发现不知觉间,写了几乎可以和那个什么什么的裹脚布相媲美的大段废话,接下来该干什么呢?众看官是不是要丢砖头了,喊道:“干什么啊!!这么简单的一个问题说这么复杂!!浪费了我们这么多的时间,不知道浪费别人的时间等同于谋财害命吗?”汗汗!佛说:“浪子回头金不换”,好,那我回头了,希望还来得及~

      回头做什么呢?当然满足各位的要求,来点实战的,不然我真是万死莫辞了~实战?拿什么实战?那就拿这个帖子的本源——楼主的程序里出现的问题来实战下,看看我们该如何解决这个简单的问题。上面分析了很多,现在就让我们在实战中来检验分析的正确性。倒回去吧,从最后的剖析开始讲起,用这些剖析来解决这个问题。。。

   最后的说了什么?“mouse down事件处理程序里,你立马做除法运算,而这个时候,因为lose focus事件没有发生,除数为0,所以,结果就是Inf咯”我们没办法改变事件的先后(没办法吗?有办法的,呵呵),那就改变事件的处理程序。看下上面这段话,mouse down发生了,立马进行除法运算,而这个时候,numeric1的lose focus还没发生,所以导致问题。认识到这点,解决起来就很容易,让mouse down事件发生之后,不立马做除法运算就OK了,好,这个就是我们的解决方案1,请参见附件(8.2版本)



      再倒回去,让我们来修改下mouse down和lose focus的执行先后次序。前面说到,mouse down事件发生在lose focus之前,是因为mouse down有个坚强的后盾,它是standard优先级的,而lose focus只是GUI优先级,而且我们也知道在什么地方修改优先级,所以,在这里,只要把mouse down所处的程序的优先级(我把它称为算法的优先级)改为user interface就可以了。(两个都是user interface,为什么lose focus会先运行呢?可能是因为lose focus是labview内置进去了,是程序的一部分了,正所谓强龙不压地头蛇吗,所以lose focus先执行了,哈!),请参加附件(注意这个和楼主的附件一样,但优先级改了)


   那还有没解决方法呢?当我不改优先级,不加延时,只是把button的事件由mouse down改为value changed,发现就可以了。那为什么value changed优先级要在lose focus后面呢?或者说,为什么三者的优先级,在默认配置下,居然是mouse down>lose focus>value changed呢?这个解释就要涉及到botton的mechanism和value changed这个事件究竟是如何触发的这样一个话题,我也不清楚,就不说了(事实上是说不出来 ),那么,最后一个方法,把事件改为value changed


[ 本帖最后由 飞雨天 于 2008-4-29 17:14 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 顶

使用道具 举报

 楼主| 发表于 2008-5-2 22:41:58 | 显示全部楼层
,我的神呐,飞雨天你是我崇拜的偶像
回复 顶

使用道具 举报

发表于 2009-2-28 15:52:46 | 显示全部楼层
牛人,分析得很到位,崇拜!!!
回复 顶

使用道具 举报

发表于 2009-2-28 17:48:31 | 显示全部楼层
回复 顶

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2026-9-30 00:01 , Processed in 0.066500 second(s), 14 queries , Gzip On, File On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表