全队列(thread safe queues)三种机制来保护共享数据,实现线程间安全的数据传输。
其中线程安全队列保护机制传输数据量大;且读取数据和写数据互不影响;数据传输基于事件模式,可以注册读取数据和写数据回调函数在队列数据达到指定数量才被调用。
基于多线程监控程序的典型应用为:辅助线程采集处理大量数据并传递给主线程进行显示,线程安全队列机制是最佳的选择。
写入线程把要传送给读出线程的数据打包后写入到数据队列中,数据队列采用先进先出的工作模式,每写入一个数据包,系统调用在读出线程指定的回调函数来处理数据。
选择合适的队列长度后,即使读出线程没有完成上一个数据包的读出,写入线程依然可以安全的写入下一个数据,对数据队列可以同时进行读写操作,线程间的数据传输是安全可靠的。
监视控制辅助线程 监视控制辅助线程的运行,是多线程协调运行的另一个关键问题,CVI 提供了 CmtGetThreadPoolFunc- tionAttribute 函数来监视辅助线程的状态。
在多通道、定时数据采集的监控软件中,多个辅助线程定时处理某项任务,直到主线程通知其停止。
CVI 提供的异步定时器机制可以方便的实现以上功能,但异步定时器机制只能创建一个辅助线程。
结合线程池机制和定时器控件成为可行的选择之一。
CVI 在创建面板的线程中调用该面板控件的回调函数,即要在辅助线程中运行某一定时器控件的回调函数,则该定时器控件所在的面板必须在辅助线程中创建。
这样,主线程就可以通过开关该定时器来控制辅助线程开始或停止某项任务,实现多个辅助线程定时处理某项任务,且每个线程定时可以不同。
19、如何实现 CVI 窗体的全屏GetMonitorFromPanel Main ampmonitor//获得显示器 IDGetMonitorAttribute monitor ATTR_HEIGHT ampheight//得到高度GetMonitorAttribute monitor ATTR_WIDTH ampwidth//得到宽度SetPanelSize Main height-25width//设置窗口高宽度 (高度需要去处任务栏的部分)SetPanelPos Main 25 0//设置窗口位置但仍会看到状态栏,像游戏一样的全屏还没想到。
希望网页跟贴解决哦。
20、如何在 LABWINDOWS 中调用 MATLAB 程序?CVI 和 Matlab 混合编程,必须要先安装 Matlab在 CVI 中,建立 ActiveX 控件服务器,选择 Matlab Automatin Server Type Library.Matlab 必须在 CVI 之前安装才能看到这个选项),创建后将生成三个文件,XXX.fp XXX。
C 和 XXX.h,将。
C 和。
H 文件包含在 CVI 工程中就可以了。
。
C 文件中包含着 CVi 和 Matlab 的接口函数。
其中就包括打开 Matlab 函数,运行 Matlab 函数等。
21、如何在 CVI 中播放 Flash 影片?需要先安装好 FLASH PLAYER 的 IE 插件。
实现方法:主要是通过调用 ActiveX 控件的方式进行。
需要在 panel 上创建一个 ActiveX 容器。
第一步:获得 ActiveX 控件句柄;errorCode MD_NO_ERROR errorCode GetObjHandleFromActiveXCtrl panel control movie iferrorCode 0 goto error第二步:设置播放文件路径;errorCode ShockwaveFlashObjects_IShockwaveFlashSetMoviemovie NULL path iferrorCode lt 0 goto error第三步:开始播放文件errorCode ShockwaveFlashObjects_IShockwaveFlashPlay movie NULL iferrorCode lt 0 goto error第四步:关闭打开的对象句柄;errorCode CA_DiscardObjHandle movie22、如何动态调用 DLL?include ltwindows.hgtinclude ltansi_c.hgtinclude ltutility.hgtinclude ltcvirte.hgt根据函数申明进行定义typedef intlpaddfunchar charint main int argc char argv void handle0 char str1100str2100 lpaddfun DISKID32 HMODULE DLLhandle if InitCVIRTE 0 argv 0 0 return -1 / out of memory /DLLhandle LoadLibrary quotd:Customerdiskid32v2.00DiskID32.dllquotDISKID32 lpaddfunGetProcAddress DLLhandlequotDiskID32quot//执行函数释放 DLL FreeLibraryDLLhandle23、CVI 编译器设置参数的意思build options 菜单 Default calling convention 选项中有两个选项一个是quotcdeclquot另一个是quotstdcallquotStdCall pascal cdecl 区别:参数传入 Stack 的顺序有所不同Directive Parameter order Clean-up Passes parameters in registersregister Left-to-right Routine Yespascal Left-to-right Routine Nocdecl Right-to-left Caller Nostdcall Right-to-left Routine Nosafecall Right-to-left Routine No _stdcall 将参数压栈是按 C 语言的顺序(从右到左),但与 C 语言不同的是它是由被调用者将参数从栈中清除的所以它的编译文件比_cdecl小。
_stdcall 是 Windows API 函数中默认的调用约定,VB、
VFP 等也采用这个约定。
_cdecl 是 C 语言采用的默认调用方法,它的优点是支持 printf 这样的可变参数调用。
另外,VC对于两种调用方法的名称转换方法也不同。
不断更新中.... 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:只能做显示用,不能产生任何事件。
1.请问 CVI 中条件断点的作用是什么?回答CVI 中的条件断点不同于普通断点,只有在某些条件被满足后条件断点才会中断程序的运行。
这些条件可以是某个变量等于了某一个值,另外,条件断点还可以设置成当一个条件被满足一定次数以后这个断点才会有效。
2.请问 CVI 中的控件有哪几种模式,各有什么意义?回答CVI 中的控件一共有四种模式,分别是:Normal、Hot、Validate 以及 Indicator。
Normal 指这个控件可以由用户直接操作或者是通过编程来进行操作。
但是只能够产生数值改变事件而不能产生 COMMIT 事件。
Hot 指这个控件可以由用户直接操作或者是通过编程来进行操作。
用户的操作可以产生数值改变事件以及 COMMIT 事件。
Validate 指与 Hot 模式相似,但是 CVI 环境会检查面板上所有数值控件的值是否处于有效范围内,只有所有的值都有效才会产生 COMMIT 事件。
如果有无效值存在就会弹出一个对话框,而不生成 COMMIT 事件。
Indicator 指这个控件只能通过编程进行操作。
用户对其的操作不会产生任何事件。
3.CVI 中如何调用帮助文件?回答在 CVI 中调用帮助文件有两种方式。
ShowHtmlHelp HH_DISPLAY_TOPIC 0和 SystemHelp quotquot HELP_CONTENTS 0 0可以根据自己编写的帮助文件来使用不同的函数。
4.CVI 中的事件驱动,在一个回调函数中会响应几个事件? 回答在 CVI 中的事件,当控件响应一个鼠标按钮时它会产生几种事件,并在回调函数中执行响应的代码。
例如:当用鼠标点击开关 时会产生 EVENT_COMMIT 和 EVENT_VAL_CHANGED 事件,这样在回调函数中就会出现执行两个不同的代码的情况。
5.CVI 中如何实现系统托盘图标? 回答在 CVI 中可以通过 Programmers Toolbox 提供的 System Tray Icons 来实现系统托盘图标。
将应用程序的图标放到托盘上去。
6.CVI 中如何实现及时提示功能? 回答在 CVI 中为了实现 Windows 中当鼠标指针放到某个按钮控件上时自动出现提示,简单说明该按钮的功能。
可以使用 SetCtrlToolTipAttribute 函数来实现该功能。
1.在CVI中,是否支持一个有冲突变量的函数? 回答支持,比如说以下包含冲突变量就可以运行: include ltstdio.hgt include ltstdarg.hgt float averageint num ... main float x x average10 1 2 3 4 5 6 7 8 9 10 printfquotnThe first average is f.quot x x average5 121 206 76 31 5 printfquotnThe second average is f.quot x float averageint num ... / declare a variable of type va_list / va_list arg_ptr int count int total0 / initialize the argument pointer / va_startarg_ptr num for count0 count lt num count total va_argarg_ptr int / clean up / va_endarg_ptr returnfloattotal/num 2.如何减少 CVI 程序的 CPU 占用率?回答可以在 Options-》Enviroment 中进行设置,将 Sleep Policy 设置为 Sleep More。
或者在程序中进行设置,设置函数为:SetSleepPolicy VAL_SLEEP_MORE。
3.在 CVI 中如何实现将这次面板参数作为下次的缺省值使用?回答一般情况下可以使用文件将各参数保存下来,在下次调用面板时再调用这些参数。
也可以使用 CVI 自带的函数 SavePanelState和 RecallPanelState。
4.CVI 中如何实现进度条功能?回答CVI 中可以使用 slide 控件实现进度条功能。
也可以使用 Programmers Toolbox 里带的函数来创建进度条。
5.CVI 中的 TUI 文件?回答TUI 文件实际上是 UIR 文件的文本版本,在使用时同 UIR 文件的调用方式相同。
6.CVI 中使用控件的 Tab 顺序功能时如何略过某些控件?回答将控件改变为 Indicator 控件,在 CVI 中 Tab 顺序是略过显示控件的;2、将控件灰掉,CVI 会略过灰掉的控件;3、将下一个控件作为活动控件,从而略过一个控件。
1.在 LabWindows/CVI 中如何用多个安全队列SafeQueue来实现对多个采集任务的数据保护?回答一般来说,在编写一个多线程程序时,我们会在默认的线程池DefaultThreadPool中建立一个或多个 SafeQueue;然后再建立2 个新的线程池NewThreadPool,分别用于数据的采集和处理;在用于采集的线程池中建立多个线程Thread,分别对应各个板卡或通道;在用于数据处理的线程池ThreadPool中建立一个或多个线程来对进行相应的操作。
2.在安装 NI 软件的过程中(包括 LabVIEW CVI hardware drivers 或使用了 MSI installer 进行安装的其它 NI 软件),出现错误 2894 致使安装程序被迫中止,如何解决该问题?回答该问题是微软网站上已经公布的 Microsoft Installer 常出现的问题之一。
已知有两个原因可能导致出现该问题:其一就是错误的或者被破坏了的 Riched20.dll 存在于用户的计算机上,或用户计算机上的的 Riched20.dll 文件丢失。
其二就是用户的计算机被诸.
上一篇:
空调售后服务系统4
下一篇:
湖南成考如何报考函授本科?参考资料