关于lv调用dll
时间:12-13
整理:3721RD
点击:
手头的一个dll,用lv调用老是出问题,今天有了一点发现:
这个dll封装了一堆数据库操作的函数,不论是取数据还是存数据,如果连续不断,没有时间间隔的取或者存,那么操作就没有问题,但是时间间隔稍微长一点就出问题了。
原来的操作是先打开一次数据库,把数据库句柄保存在dll的全局变量里,然后取或存,最后再关闭。今天改为每次取或存,都先打开,然后关闭。做过这些修改之后就没问题了。
因此推测,lv对dll是动态加载的,用完之后就会对其进行卸载。要在dll里使用全局变量保存一些数据的话,就需要注意了。
这个dll封装了一堆数据库操作的函数,不论是取数据还是存数据,如果连续不断,没有时间间隔的取或者存,那么操作就没有问题,但是时间间隔稍微长一点就出问题了。
原来的操作是先打开一次数据库,把数据库句柄保存在dll的全局变量里,然后取或存,最后再关闭。今天改为每次取或存,都先打开,然后关闭。做过这些修改之后就没问题了。
因此推测,lv对dll是动态加载的,用完之后就会对其进行卸载。要在dll里使用全局变量保存一些数据的话,就需要注意了。
赞
re
刚开始在LV里用dll
赞啊赞
以前调用过
失败
遂放弃
每次把句柄传一次给dll。
调用dll少输入输出数组就不会有大问题。
LabVIEW 中对DLL线程调用方式有Run in UI Thread 和Reent rant 两种调用方式。
在DLL 只被一个线程调用的情况下,两种调用方式都可选择,但在多线程调用情况下,需注意选择。Run in UI Thread 表示在用户接口线路中调用,DLL 的执行期将等到用户接口线程(在此即LabVIEW环境下的VI 应用程序) 执行DLL 的导出函数调用时才始;Reent rant 表示允许多个线程同时调用这个DLL 。如果你确定编制的DLL 为线程安全———简单地说,就是编制DLL 过程中,充分考虑了线程保护的同步机制,如使用临界区、互斥、信号量等,那么可以选用Reent rant 方式,这将有助于提高DLL 调用的性能。
呵呵,跟调用方式无关,跟lv对资源的管理有关
根据我调用DLL的一点经验,有些时候调用别人写的DLL时,Run in UI Thread模式有时候会使得每次运行的时间不定并且容易出错,这个时候改为Reentrant问题就解决了。
都一样的,呵呵
那怎么解释这种现象呢?
明天打电话骚扰NI的客服去,估计主要问题在lv对资源的管理上,因为不知道那个dll什
么时候就被卸载了