在labview中调用DAQmx任务引用后没有关闭该引用,导致内存泄漏。LabVIEW提示的错误代码为: {错误-50353发生于 不明位置 可能原因 One or more memory pages in the specified logical buffer could not be locked into physical memory. The operation could not be completed as specified.}
主要程序框图见下面三个图,程序最外面是一个while循环,中间是含有两帧的Sequence顺序结构。第一帧内是一个包含超时的事件结构;第二帧是检查外部开关按键的状态。一个Create DAQmx Task VI后传出的引用连在后面的Case页隧道,在假case页中关闭了DAQmx的引用如图二,但在真的Case页中却忘了关闭此引用如图三。当程序运行一段时间大概十分钟后,DAQmx反复的创建任务就要反复的开辟一块内存,直到把系统的内存都耗尽,LabVIEW将报如上面所示的错误。把Windows自带的任务管理器打开,在性能页将看到内存占用曲线连续上升。 该程序的缺点如下, 1. 程序架构太复杂,结构嵌套层数太多,不好理解和查错。 2. DAQmx的VI最好是写在一个单独的子VI中,这样就不会忘记关闭任务引用了。 3. 程序细节和常量最好放在单独的VI中。 4.最好不要用顺序结构,特别是层叠式顺序结构。 NI工程师评论: 内存泄露的问题,这个问题比较普遍,DAQmx任务涉及到硬件资源,凡是打开了硬件就需要及时的关闭硬件
就我个人习惯而言,如果有可能在一个程序中尽量只创建一次任务,关闭一次任务,在while中重复的对该任务进行
操作,这样就不会出现冲突以及内存泄露问题。
图一 顺序结构第一帧
图二 顺序结构第二帧,关闭DAQmx的引用的假case页
图三 顺序结构第二帧,未关闭DAQmx的引用的真case页。
|