探针

设置断点后, 程序每次执行到断点处都会停下来。但有时候,调试者希望程序只在被监测的数据满足某一条件时才暂停运行.比如被监测的数据在正常情况下应大于或等于零,调试者希望一旦数据小于零则暂停. 相当于条件断点,满足条件则暂停
custom probe—conditional double probe
image.png
???用户自定义探针
需要给队列数据类型加一个探针。LabVIEW 自带的探针只能显示出表示这一队列的一个32 位整数,这对于调试
程序帮助不大。用户自定义探针其实就是一个Vl o LabVIEW 自带了一些已经做好的探针,都被放置在[ LabVIEWJ \ vi. lib_probes 文件夹下,自定义探针。
image.png

程序框图禁用结构

类似于C中/ /注释掉

常见错误

数值溢出

image.png

for循环的隧道

当输入的数据是个空数组时, for 循环中的代码不会被执行.从循环输出隧道读到的文件引用已经不是输入的那个引用了。后续的程序也就元法关闭被打开的文件, 曾经遇到并处理过一些有内存泄漏的程序,其实就是由这个错误引起的。所以,在传递类似的句柄数据出入for 循环时, 一定要使用移位寄存器。
错误代码:当数据为空数组时,无法关闭文件,容易造成内存泄漏。
image.png
正确代码:
image.png
错误簇数据在传入传出循环结构时,也一定要使用移位寄存器,原因还不仅是防止在循环次数为0 时,错误信息丢失。另一个主要的原因是,通常一个节点有错误输出,意味着后续的程序都不应该执行.在有错误的情况下继续执行程序代码,风险非常大,有可能引起程序、甚至系统崩溃。使用移位寄存器后,任何一次循环产生的错误都会立即传递到后续的循环中,从而及时防止后续迭代过程中循环结构中的节点被再次执行

移位寄存器的初始化

没有初始化的移位寄存器,在VI被关闭前会一直保存上一次运行结束时的数据。这个特点在某些情况下可以被程序员利用,功能全局变量便是利用了此特性.

时序

  • 在使用簇数据类型时,需要遵循以下原则

1)凡是用到簇的地方,就为它创建一个类型定义
2)凡是在簇数据需要捆绑或松绑的地方,统统使用按名称捆绑或松绑节点.

  • 数据竞争

利用信号量或功能全局变量。信号量与集合点

提高查询运行效率

28原则:CPU占用耗时查询—Performance and memory

优化20%的耗时代码,“工具—性能分析—性能和内存”(Tools—profile—performance and memory)
点击start—snapshot—stop查看耗时代码。列出的是VI的CPU占用时间。
如果程序里存在大量的不必要的延时,或者程序常常被某些低速工作(如读/写外部仪器、通过网络传输数据等)所阻塞,这样的程序运行速度肯定也是很慢的。但是,这一类的低效率因素在性能和内存信息工具上是体现不出来的.有些非常耗用CPU 的操作,在性能和内存信息工具上也无法体现。比如线程切换、内存开辟等操作虽然耗时,但却不会在工具中显示出来.这些内容的程序段到底运行了多少时间,需要使用其他的方法来查看。
image.png

查看一段代码的运行时间

使用一个顺序结构,在被测程序开始前,记录一下当时的时间,程序运行结束,再查看一下当时的时间,其差
值就是程序运行的时间。

解决程序效率低下的瓶颈

读/写外设、文件

设备的速度是不可能通过优化程序来加以提高的,但是可以考虑在程序读/写外设、文件的同时,同步处理一些其他的运算。这样,不至于让这部分工作耽误整个程序的运行。
提高程序效率的方法是通过优化程序结构,减少对外设和文件的访问次数。
image.png
image.png
image.png

界面刷新

一个界面至少要停留几百毫秒,用户才能够看清楚它.如果以很高的速度更新界面上某个控件的值,比如以每秒一百次的速度刷新一个数值控件,由于数值变化太快、飞速闪动,用户是根本看不清楚控件里出现的数据的.所以,界面刷新的次数应当减少到适当的程度,以降低程序运算量.

循环内的运算

迭代间的数据传递应该通过移位寄存器进行。

调试信息

V**I 发布给用户后,如果不需要用户调试这些VI.应当将VI 设置为不可以调试。**这样,就移除了VI 中的调试信息,从而可以使得程序减少近50% 的CPU 时间与内存占用。

多线程和内存的使用