labwindowscvi扫盲技巧贴.docx
- 文档编号:29876966
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:24
- 大小:97.99KB
labwindowscvi扫盲技巧贴.docx
《labwindowscvi扫盲技巧贴.docx》由会员分享,可在线阅读,更多相关《labwindowscvi扫盲技巧贴.docx(24页珍藏版)》请在冰豆网上搜索。
labwindowscvi扫盲技巧贴
LabWindows/CVI扫盲+技巧贴〔CVI学习必看〕
字体:
小中大|打印发表于:
2021-6-1113:
15 作者:
LAVA 来源:
TestDevelop
1、什么是LabWindows/CVI?
NILabWindows/CVI是一类久经历证的ANSIC集成开发环境,为工程师和科学家提供用于创立测试和控制应用的全套编程工具。
NILabWindows/CVI兼有ANSIC的耐用性、复用性和特定的工程性能,适用于仪器控制、数据采集、分析和用户界面开发。
2、CVI适宜什么人使用?
CVI是基于ANSIC的快速开发环境,适用于有C,C++根底。
使用VB,VC,BC运用控件式组织用户界面的工程师。
3、CVI有几种版本?
根本版RMB10220
∙ANSIC开发环境
∙用户界面设计
∙数据采集和仪器控制
∙IVI驱动连接
完好版RMB21305
∙首选的自动化测试软件包
∙300多个数学/分析函数
∙因特网连接
∙WindowsSDK
∙.NET开发工具
目前最新的是8.5版,以下图是CVI的版本历史:
4、CVI开发的程序能否独立运行?
可以。
和所有的开发工具一样,CVI编写的程序只要提供CVI运行支持库〔CVIruntime)即可。
5、CVI的运行支持库在哪里下载?
c:
\iknow\docshare\data\cur_work\t
6、是否要每次手动安装支持库?
否,CVI程序带有发布功能。
自动生存你工程需要的所有运行库。
菜单Build——distributions下。
7、EXE程序的信息在哪里定义?
菜单Build——Buildsteps...下可以更改EXE的图标,版权信息等等。
8、新手怎么开始学习CVI?
新手可以先看看这些书籍和资料。
9、CVI在哪里下载?
10、如何在CVI中获得系统信息
使用CVI提供的toolbox:
GetWinOSVersion获得操作系统信息
GetWindowsDirs获得Windows目录
GetDiskSpace得到磁盘空间大小,对于文件保存有用,先判断磁盘大小再保存,否那么提示。
GetMemoryInfo获得内存信息。
CODE:
GetDiskSpace("C:
",totalBytes64,&freeBytes64);
diskSpaceMB=(double)totalBytes64.hiBytes*4096+(double)totalBytes64.loBytes/1048576;
freeSpaceMB=(double)freeBytes64.hiBytes*4096+(double)freeBytes64.loBytes/1048576;
我也来说两句查看全部回复
最新回复
∙LAVA(2021-6-1113:
45:
21)
11、CVI中如何翻开别的应用程序文件,如Doc,PDF,HLP?
CODE:
OpenDocumentInDefaultViewer("C:
\example.pdf",VAL_NO_ZOOM);12、怎么在CVI中使用非NI公司的PCI板卡?
其它厂家虽然没有NI这样的FP文件或向导,但都提供DLL动态链接库使用。
VCBC,CVI通用。
13、如何使用DLL?
需要DLL文件和H头文件,LIB文件。
#inlcude"头文件名.h"参加CVI中。
将*.lib文件参加工程中。
工程右击——addfile...即可使用DLL。
14、没有LIB文件如何使用DLL?
在CVI菜单中翻开DLL相应的.h文件。
Option——GenerateDLLImportLibrary选择DLL文件,即可生成LIB文件。
15、如何根据DLL和.H文件看到C代码?
Option——GenerateDLLImportsource选择DLL文件,即可生存C文件。
不过只有函数定义,源代码就不用想了,如今还没有DLL的破解。
16、如何创立DLL程序文件?
Build——TargetType——DynamicLinkLibrary,即可将当前的工程生存DLL形式。
同理StaticLibrary生存Lib形式。
17、运行时窗口的响应慢,显示不及时?
CVI是事件驱动式的运行方法,排队响应个个事件。
造成显示滞后。
需要强迫在函数中参加ProcessSystemEvent()。
当然有效的方法是使用CVI或API的多线程技术。
18、CVI中获取本地计算机的IP地址
可以调用GetTCPHostAddr函数。
需要注意的是,该函数获取的是当前程序运行的电脑的默认IP地址。
GetTCPHostAddr函数会向Windows操作系统获取所有可用的IP地址的列表,但返回的只是其中的第一个。
同样地,假设要获取该电脑的所有IP地址,可以调用GetAllTCPHostAddresses函数来实现。
19、CVI如何实现右键菜单功能?
调用编辑好的右键菜单可以使用以下两个函数实现:
CODE:
menuHandle=LoadMenuBar(0,"popupmenu.uir",MENUBAR);
RunPopupMenu(menuHandle,MENUBAR_MENU1,panel,eventData1,eventData2,1,1,1,1);20、CVI对多线程的如何支持?
CVI对多线程的支持〔1〕概念篇
【原帖地址:
】
多线程对于windows应用程序来说,并不是什么先进的技术,翻开你的任务管理器,选择“进程〞分页,点击菜单的在“查看〞->选择列,在“线程计数〞前打勾,确定后你在“进程〞分页里头看到如今在运行的绝大多数程序都基于2个以上的线程。
那么进程线程的概念以及他们之间的关系又是什么呢?
线程技术是指开发架构将应用程序的一部分别离为“线程〞,使线程与程序其余部分执行步骤不一致。
线程是一种特殊的对象,是操作系统执行多任务的一部分,它允许应用程序的一部分独立于其他对象而单独运行,因此也就脱离了应用程序的常规执行顺序。
目前主流的Windows系统都是基于多任务机制,即可同时运行多个应用程序〔“应用程序〞这个词并不恰当,恰当的说法是“进程〞〕。
当启动应用程序时,系统就会为该应用程序分配所需的内存以及其他资源。
内存和资源的物理别离叫做进程。
换言之,进程是应用程序的一个运行实例,当然,应用程序可以启动多个进程。
每个进程至少有一个根本线程〔主线程〕。
线程与数据一起隔离在某一物理区域,在进程中声明的数据可通过该线程进展访问。
Windows操作系统为抢占式多任务运行机制,即采用时间片轮换的方式来执行多任务,时间片轮换的根本对象是线程。
操作系统为每一个线程分配时间片,让该线程在这个时间段内运行,之后中断该线程的运行,启动另外的线程执行。
多线程技术的优势在于将进程分解,在主线程外产生一个或几个辅助线程,用于完成如数据采集、网络访问、数据存储等后台工作。
CVI对多线程的支持〔2〕根本原理
【原帖地址:
c:
\iknow\docshare\data\cur_work\t】
在典型的LabWindws/CVI多线程程序中,使用下线程创立、显示并运行用户界面,在次线程中,运行其它的对时间要求很高的操作[3]。
LabWindows/CVI提供了两种设计辅助线程的机制,分别为线程池〔threadpools〕和异步定时器〔asynchronoustimers〕,线程池适用于需要不连续地执行屡次或在循环中执行的任务,而异步定时器适用于在固定时间间隔内执行的任务〔只支持一个辅助线程〕,假设要使用多个辅助线程,只能采用线程池技术。
多线程的创立
线程池机制中辅助线程的创立是通过调用实用库〔UtilityLibrary〕的CmtScheduleThreadPoolFunctionAdv函数,把想要在次线程中运行的函数名传递给它,线程池调用这个函数在它的其中一个线程中运行。
根据线程池的设置和当前状态,线程池创立一个新的辅助线程,使用一个已经存在的空闲线程,或等待一个活动的线程空闲来执行需要调度的函数。
多线程间的数据平安
数据保护是在使用辅助线程时必需要解决的关键问题,防止多个线程同时操作某一变量,导致逻辑错误,是多线程协调运行的重要内容。
在CVI中,系统提供了线程锁〔blocked〕、线程平安变量〔threadsafevariables〕和线程平安队列〔threadsafequeues〕三种机制来保护共享数据,实现线程间平安的数据传输。
其中线程平安队列保护机制传输数据量大;且读取数据和写数据互不影响;数据传输基于事件形式,可以注册读取数据和写数据回调函数在队列数据到达指定数量才被调用。
基于多线程监控程序的典型应用为:
辅助线程采集处理大量数据并传递给主线程进展显示,线程平安队列机制是最正确的选择。
写入线程把要传送给读出线程的数据打包后写入到数据队列中,数据队列采用先进先出的工作形式,每写入一个数据包,系统调用在读出线程指定的回调函数来处理数据。
选择适宜的队列长度后,即使读出线程没有完成上一个数据包的读出,写入线程仍然可以平安的写入下一个数据,对数据队列可以同时进展读写操作,线程间的数据传输是平安可靠的。
监视控制辅助线程
监视控制辅助线程的运行,是多线程协调运行的另一个关键问题,CVI提供了CmtGetThreadPoolFunc-tionAttribute函数来监视辅助线程的状态。
在多通道、定时数据采集的监控软件中,多个辅助线程定时处理某项任务,直到主线程通知其停顿。
CVI提供的异步定时器机制可以方便的实现以上功能,但异步定时器机制只能创立一个辅助线程。
结合线程池机制和定时器控件成为可行的选择之一。
CVI在创立面板的线程中调用该面板控件的回调函数,即要在辅助线程中运行某一定时器控件的回调函数,那么该定时器控件所在的面板必须在辅助线程中创立。
这样,主线程就可以通过开关该定时器来控制辅助线程开始或停顿某项任务,实现多个辅助线程定时处理某项任务,且每个线程定时可以不同。
∙LAVA(2021-6-1113:
58:
29)
21、如何实现CVI窗体的全屏?
CODE:
GetMonitorFromPanel(Main,monitor);//获得显示器ID
GetMonitorAttribute(monitor,ATTR_HEIGHT,height);//得到高度
GetMonitorAttribute(monitor,ATTR_WIDTH,width);//得到宽度
SetPanelSize(Main,height-25,width);//设置窗口高宽度 〔高度需要去处任务栏的部分〕
SetPanelPos(Main,25,0);//设置窗口位置但仍会看到状态栏,像游戏一样的全屏还没想到。
希望网友跟贴解决哦。
22、如何在LabWindows中调用Matlab程序?
CVI和Matlab混合编程,必需要先安装Matlab
在C23、如何在CVI中播放Flash影片?
需要先安装好FLASHPLAYER的IE插件。
实现方法:
主要是通过调用ActiveX控件的方式进展。
需要在panel上创立一个ActiveX容器。
第一步:
获得ActiveX控件句柄;
CODE:
errorCode=MD_NO_ERROR;
errorCode=GetObjHandleFromActiveXCtrl(panel,control,movie);
if(errorCode!
=0)
gotoerror;第二步:
设置播放文件途径;
CODE:
errorCode=ShockwaveFlashObjects_IShockwaveFlashSetMovie(*movie,NULL,path);
if(errorCode<0)
gotoerror;第三步:
开始播放文件
CODE:
errorCode=ShockwaveFlashObjects_IShockwaveFlashPlay(*movie,NULL);
if(errorCode<0)
gotoerror;第四步:
关闭翻开的对象句柄
CODE:
errorCode=CA_DiscardObjHandle(movie);24、如何动态调用DLL?
CODE:
#include
#include
#include
#include
//根据函数申明进展定义
typedefint(*lpaddfun)(char[],char[]);
intmain(intargc,char*argv[])
{
void*handle=0;
charstr1[100],str2[100];
lpaddfun DISKID32;
HMODULEDLLhandle;
if(InitCVIRTE(0,argv,0)==0)
return-1; /*outofmemory*/
DLLhandle=LoadLibrary ("d:
\\Customer\\diskid32v2.00\\DiskID32.dll");
DISKID32=(lpaddfun)GetProcAddress(DLLhandle,"DiskID32");
//执行函数
//释放DLL
FreeLibrary(DLLhandle);
}25、CVI编译器设置参数的意思?
buildoptions菜单Defaultcallingconvention选项中,有两个选项,一个是"cdecl",另一个是"stdcall",
StdCallpascalcdecl区别:
参数传入Stack的顺序有所不同
DirectiveParameterorderClean-up Passesparametersinregisters?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
_stdcall将参数压栈是按C语言的顺序〔从右到左〕,但与C语言不同的是它是由被调用者将参数从栈中去除的,所以它的编译文件比_cdecl小。
_stdcall是WindowsAPI函数中默认的调用约定,VB、VFP等也采用这个约定。
_cdecl是C语言采用的默认调用方法,它的优点是支持printf这样的可变参数调用。
另外,VC++对于两种调用方法的名称转换方法也不同。
不断更新中....
∙LAVA(2021-6-1114:
00:
20)
1.CVI的.fp文件的类属性近似C++中的类的概念么?
不是的,CVI中类仅说明文件在仪器驱动程序中的等级,指明其所处的层次,CVI中和C++中的类相近的概念可以理解为各种面板!
2.CVI中如何作数据流盘?
一般情况下我们可以使用CVI8.1提供的TDM库函数。
另外可以使用磁盘阵列,自己编写数据保存,注意一次写入磁盘的数据量为64的整倍数,但是也不要过大。
3.如何在CVI中使用inp等低级函数?
CVI中是不能直接使用这种类型的函数对端口地址进展操作。
需要使用CVILowLevelSupportDriverLoaded函数翻开CVI对低级函数的支持。
4.请问CVI中的事件驱动是指什么?
事件驱动是CVI应用程序和用户进展交互的核心原理,详细是指应用程序通过响应用户界面所发生的“事件〞来执行代码、调用回调函数。
这些事件可以是发生在面板上的对象或者是面板自身。
使用LabWindows/CVI进展编程,可以生成事件驱动的代码。
通过事件驱动代码,可以将用户界面中的控件连接到代码中的函数。
每次对用户界面进展操作都会产生一个事件,LabWindows/CVI就会确定在何控件上发生了什么事件,假设对该控件有一个相应的回调函数,就会激活并运行该回调函数中的代码,进而响应事件。
5.请问CVI中回调函数的参数分别有什么意义?
CVI中回调函数的第一个参数是控件所在的面板的句柄。
第二个参数为产惹事件的控件的标识符。
第三个参数是所产生的事件。
第四个参数是回调数据,这些回调数据被用来在回调函数之间传递数据。
回调数据可以是任何类型的数据。
第五和第六个参数随着事件的不同而不同。
6.LabWindows/CVI控件的四种形式有何区别?
1.Normal:
该形式下用户对控件的操作可产生除Commit事件外的所有事件。
2.Hot:
该形式下可产生包括Commit事件在内的所有事件。
3.Validate:
在满足相应条件时可产生Commit事件。
4.Indicator:
只能做显示用,不能产生任何事件。
∙LAVA(2021-6-1114:
25:
59)
1.请问CVI中条件断点的作用是什么?
CVI中的条件断点不同于普通断点,只有在某些条件被满足后条件断点才会中断程序的运行。
这些条件可以是某个变量等于了某一个值,另外,条件断点还可以设置成当一个条件被满足一定次数以后这个断点才会有效。
2.请问CVI中的控件有哪几种形式,各有什么意义?
CVI中的控件一共有四种形式,分别是:
Normal、Hot、Validate以及Indicator。
oNormal指这个控件可以由用户直接操作或者是通过编程来进展操作。
但是只可以产生数值改变事件而不能产生COMMIT事件。
oHot指这个控件可以由用户直接操作或者是通过编程来进展操作。
用户的操作可以产生数值改变事件以及COMMIT事件。
oValidate指与Hot形式相似,但是CVI环境会检查面板上所有数值控件的值是否处于有效范围内,只有所有的值都有效才会产生COMMIT事件。
假设有无效值存在就会弹出一个对话框,而不生成COMMIT事件。
oIndicator指这个控件只能通过编程进展操作。
用户对其的操作不会产生任何事件。
3.CVI中如何调用帮助文件?
在CVI中调用帮助文件有两种方式。
ShowHtmlHelp(,HH_DISPLAY_TOPIC,0);和SystemHelp("",HELP_CONTENTS,0,0);可以根据自己编写的帮助文件来使用不同的函数。
4.CVI中的事件驱动,在一个回调函数中会响应几个事件?
在CVI中的事件,当控件响应一个鼠标按钮时它会产生几种事件,并在回调函数中执行响应的代码。
例如:
当用鼠标点击开关时会产生EVENT_COMMIT和EVENT_VAL_CHANGED事件,这样在回调函数中就会出现执行两个不同的代码的情况。
5.CVI中如何实现系统托盘图标?
在CVI中可以通过Programmer'sToolbox提供的SystemTrayIcons来实现系统托盘图标。
将应用程序的图标放到托盘上去。
6.CVI中如何实现及时提示功能?
在CVI中为了实现Windows中当鼠标指针放到某个按钮控件上时自动出现提示,简单说明该按钮的功能。
可以使用SetCtrlToolTipAttribute函数来实现该功能。
∙LAVA(2021-6-1114:
34:
07)
1.在CVI中,是否支持一个有冲突变量的函数?
支持,比方说以下包含冲突变量就可以运行:
CODE:
#include
#include
floataverage(intnum,...);
main()
{floatx;
x=average(10,1,2,3,4,5,6,7,8,9,10);
printf("\nThefirstaverageis%f.",x);
x=average(5,121,206,76,31,5);
printf("\nThesecondaverageis%f.",x);
}
floataverage(intnum,...)
{/*declareavariableoftypeva_list*/
va_listarg_ptr;intcount;inttotal=0;
/*initializetheargumentpointer*/
va_start(arg_ptr,num);
for(count=0;count total+=va_arg(arg_ptr,int); /*cleanup*/ va_end(arg_ptr); return((float)total/num); } 2.如何减少CVI程序的CPU占用率? 可以在Options-? Enviroment中进展设置,将SleepPolicy设置为SleepMore。 或者在程序中进展设置,设置函数为: SetSleepPolicy(VAL_SLEEP_MORE)。 3.在CVI中如何实现将这次面板参数作为下次的缺省值使用? 一般情况下可以使用文件将各参数保存下来,在下次调用面板时再调用这些参数。 也可以使用CVI自带的函数SavePanelState和RecallPanelState。 4.CVI中如何实现进度条功能? CVI中可以使用slide控件实现进度条功能。 也可以使用Programmer'sToolbox里带的函数来创立进度条。 5.CVI中的TUI文件? TUI文件实际上是UIR文件的文本版本,在使用时同UIR文件的调用方式一样。 6.CVI中使用控件的Tab顺序功能时如何略过某些控件?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- labwindowscvi 扫盲 技巧