原创 Labwindows扫盲+技巧贴,CVI学习必看(转帖)

2008-5-27 00:08 6643 6 6 分类: 测试测量

http://www.vihome.net/bbs/viewthread.php?tid=4675


Labwindows扫盲+技巧贴,CVI学习必看


1.、完整版RMB20450


  • 仪器控制、数据采集自动化测试的首选
  • 完整的分析库,包括曲线拟合和信号处理
  • 因特网连接
  • 调用Measurement Studio基本版RMB10220


    • 集成式开发环境
    • 完整的专业用户控件组
    • 仪器I/O和DAQ助手
    • IVI驱动连接
    • .NET和ActiveX支持



    目前最新的是8.11版,下图是CVI的版本历史:

    点击看大图


    3、CVI开发的程序能否独立http://ftp.ni.com/support/softlib/labwindows/cvi/Run-Time%20Engines/8.1.1/NILWCVIRTE811.exe

    5、是否要每次手动安装支持库?
    否,CVI程序带有发布http://www.vihome.com.cn/bbs/thread-4658-1-1.html
    http://www.vihome.com.cn/bbs/thread-3180-1-1.html
    http://www.vihome.com.cn/bbs/thread-3173-1-1.html

    8、CVI在哪里下载?
    http://www.vihome.com.cn/bbs/thread-4667-1-1.html
    http://www.vihome.com.cn/sq/?uid/4829

    9、如何在CVI中获得http://easons.blogbus.com/logs/2006/04/2366573.html】
           多线程对于windows应用程序来说,并不是什么先进的技术,打开你的任务管理器,选择“进程”分页,点击菜单的在“查看”->选择列,在“线程计数”前打勾,确定后你在“进程”分页里头看到现在在运行的绝大多数程序都基于2个以上的线程。
    那么进程线程的概念以及他们之间的关系又是什么呢?
        线程技术是指开发架构将应用程序的一部分分离为“线程”,使线程与程序其余部分执行步骤不一致。线程是一种特殊的对象,是操作系统执行多任务的一部分,它允许应用程序的一部分独立于其他对象而单独运行,因此也就脱离了应用程序的常规执行顺序。
            目前主流的Windows系统都是基于多任务机制,即可同时运行多个应用程序(“应用程序”这个词并不恰当,恰当的说法是“进程”)。当启动应用程序时,系统就会为该应用程序分配所需的内存以及其他资源。内存和资源的物理分离叫做进程。换言之,进程是应用程序的一个运行实例,当然,应用程序可以启动多个进程。每个进程至少有一个基本线程(主线程)。线程与数据一起隔离在某一物理区域,在进程中声明的数据可通过该线程进行访问。
            Windows操作系统为抢占式多任务运行机制,即采用http://easons.blogbus.com/logs/2006/05/2518754.html】
        在典型的LabWindws/CVI多线程程序中,使用下线程创建、显示并运行用户界面,在次线程中,运行其它的对时间要求很高的操作[3]。LabWindows/CVI提供了两种设计辅助线程的机制,分别为线程池(thread pools)和异步定时器(asynchronous timers),线程池适用于需要不连续地执行多次或在循环中执行的任务,而异步定时器适用于在固定时间间隔内执行的任务(只支持一个辅助线程),若要使用多个辅助线程,只能采用线程池技术。
        多线程的创建
        线程池机制中辅助线程的创建是通过调用实用库(Utility Library)的CmtScheduleThreadPoolFunction Adv函数,把想要在次线程中运行的函数名传递给它,线程池调用这个函数在它的其中一个线程中运行。根据线程池的设置和当前状态,线程池创建一个新的辅助线程,使用一个已经存在的空闲线程,或等待一个活动的线程空闲来执行需要调度的函数。
        多线程间的数据安全
        数据保护是在使用辅助线程时必须要解决的关键问题,防止多个线程同时操作某一变量,导致逻辑错误,是多线程协调运行的重要内容。在CVI中,系统提供了线程锁(blocked)、线程安全变量(thread safe variables)和线程安全队列(thread safe queues)三种机制来保护共享数据,实现线程间安全的数据传输。其中线程安全队列保护机制传输数据量大;且读取数据和写数据互不影响;数据传输基于事件模式,可以注册读取数据和写数据回调函数在队列数据达到指定数量才被调用。基于多线程监控程序的典型应用为:辅助线程采集处理大量数据并传递给主线程进行显示,线程安全队列机制是最佳的选择。
    写入线程把要传送给读出线程的数据打包后写入到数据队列中,数据队列采用先进先出的工作模式,每写入一个数据包,系统调用在读出线程指定的回调函数来处理数据。选择合适的队列长度后,即使读出线程没有完成上一个数据包的读出,写入线程依然可以安全的写入下一个数据,对数据队列可以同时进行读写操作,线程间的数据传输是安全可靠的。
    监视控制辅助线程
           监视控制辅助线程的运行,是多线程协调运行的另一个关键问题,CVI提供了CmtGetThreadPoolFunc- tionAttribute函数来监视辅助线程的状态。在多通道、定时数据采集的监控软件中,多个辅助线程定时处理某项任务,直到主线程通知其停止。
    CVI提供的异步定时器机制可以方便的实现以上功能,但异步定时器机制只能创建一个辅助线程。结合线程池机制和定时器控件成为可行的选择之一。CVI在创建面板的线程中调用该面板控件的回调函数,即要在辅助线程中运行某一定时器控件的回调函数,则该定时器控件所在的面板必须在辅助线程中创建。这样,主线程就可以通过开关该定时器来控制辅助线程开始或停止某项任务,实现多个辅助线程定时处理某项任务,且每个线程定时可以不同。

    19、如何实现CVI窗体的全屏?
    GetMonitorFromPanel (Main, monitor);//获得显示器ID
    GetMonitorAttribute (monitor, ATTR_HEIGHT, height);//得到高度
    GetMonitorAttribute (monitor, ATTR_WIDTH, width);//得到宽度
    SetPanelSize (Main, height-25,width);//设置窗口高宽度    (高度需要去处任务栏的部分)
    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);
        if(errorCode != 0)
            goto error;
    第二步:设置播放文件路径
    errorCode = ShockwaveFlashObjects_IShockwaveFlashSetMovie(*movie, NULL, path);
        if(errorCode < 0)
            goto error;
    第三步:开始播放文件
    errorCode = ShockwaveFlashObjects_IShockwaveFlashPlay (*movie, NULL);
        if(errorCode < 0)
            goto error;
    第四步:关闭打开的对象句柄;
    errorCode = CA_DiscardObjHandle (movie);

    22、如何动态调用DLL?
    #include
    #include
    #include
    #include
    根据函数申明进行定义
    typedef int(*lpaddfun)(char[], char[]);

    int main (int argc, char *argv[])
    {
        void *handle=0;
        char str1[100],str2[100];
        lpaddfun  DISKID32;
        HMODULE DLLhandle;
        if (InitCVIRTE (0, argv, 0) == 0)
            return -1;    /* out of memory */

    DLLhandle = LoadLibrary    ("d:\\Customer\\diskid32v2.00\\DiskID32.dll");
    DISKID32 = (lpaddfun)GetProcAddress (DLLhandle,"DiskID32");  

    //执行函数

    释放DLL  
      FreeLibrary(DLLhandle);
    }

    23、CVI编译器设置参数的意思?
    build options菜单Default calling convention选项中,有两个选项,一个是"cdecl",另一个是"stdcall",
    StdCall pascal cdecl 区别:参数传入Stack的顺序有所不同

    Directive Parameter order Clean-up    Passes parameters in registers?
    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是Windows API函数中默认的调用约定,VB、VFP等也采用这个约定。
        _cdecl是C语言采用的默认调用方法,它的优点是支持printf这样的可变参数调用。
        另外,VC++对于两种调用方法的名称转换方法也不同。

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条