1》已经搞好一个多串口通信完成我公司变频器的通信的工程,已经投入使用,并运行正常,但是有个问题我现在还是无法搞懂。
刚开始的时候,我写这个activeX EXE工程的时候,在工程属性中,有一项为“线程模块”,一定要选择“每个对象对应一个线程”才能够正常运行程序,而如果默认选择的“使用线程池(1线程)”这样的话运行一段时间以后,这个后台的activeX EXE工程会失去响应导致客户端也会出现自动化错误而退出或死掉。请问:这个选项具体的作用是什么?为什么选择线程池会挂呢??(我开了4个通信口)2》activeX EXE工程中共享数据的问题
在activeX EXE中我有两个类,假定一个类为A,一个类为B,然后为了两个类的实例可以共同协调工作,则使用了一个标准模块GLOBAL.BAS,里面定义了一个变量C。
我的测试工程中,如果activeX EXE用二进制工程一起和测试工程运行来调试时是完全正常的,即A和B类的实例的确通过标准模块中的C进行了数据交换。
但是,当我把activeXEXE工程编译成文件,然后单独让测试工程运行时,却发现A类实例是写了变量C(通过自身公用的过程或函数Public Sub/Function WriteC),但是在B的实例中读取时却无法读取到C的值,C的值永远是0。这是怎么一回事,后来,我把C写到B的一个属性中去,并建立一个B类的引用在A类中,
'绑定唯一的B对象
Public Sub SetWarn(tB As B)
    Set myB = tB
End Sub
然后在A类中全部使用myB来进行操作myB.C = ...这样才完成了数据传送,难道前面的通过标准模块的方法不行吗???3》activeX EXE中实现异步一般方法都是通过把复杂费时,或者是循环不断做的事放入到定时器事件中来实现多线程的异步效果的,除此之外,还有别的方法吗???譬如使用MSCOMM控件的OnComm事件可以吗???请教了~~!
4》在第3问基础上---->>>
譬如实现10ms的定时器(使用API,参见http://community.csdn.net/Expert/TopicView1.asp?id=4525551),本身就是一个多线程的体现,那么放在activeX EXE中和直接放在工程中实现多媒体定时器有什么不同,各有什么优点呢??都说activeX EXE安全,而直接放在工程中速度稍微快,那到底使用哪个比较合适监视串口设备状态呢??(下位设备不断在发送数据到计算机,我接收判断,如果判断有报警信息则发送数据到设备实现控制)前提:处理判断可以控制在10ms以内。
-----------------------------------------------------------------------请“暴风雨”和各路英雄给在下说明解答,小的来世。嘿嘿一题15分!!!先答者先得分

解决方案 »

  1.   

    这一类程序一般是用VC写设备驱动,再用VB编界面
    如果一定要用VB写的话,建议用P-code多线程。只要不访问界面、不访问控件、不访问主线程创建的对象,P-code多线程不会出错的。也就是只当计算线程,靠发消息、同步API与主线程同步。这时访问串口当然不能再用MSCOMM控件,老老实实的用CreateFile打开硬件串口吧
    编写ActiveX Exe时会牵涉许多编译器细节及COM底层细节,如果没弄清楚,经常会出些莫名其妙的错误的
      

  2.   

    分不够,可以加
    ---------------------
    VB中用PCODE来写多线程,然后发送自定义消息,然后子类化窗体来接受特定消息,对吧?有个问题,我要请教一下,我发现使用多媒体定时器(不是自己开线程,因为我发现用多媒体定时器的误差很小,基本上都可以接受)时可以访问界面。另外,什么叫VC写设备驱动程序?我们只有一套协议,了解协议以后就可以通信了,不用编什么驱动的了。如果用VC来写后台数据处理的话(DLL文件),道理是不是和VB里自己实现多线程发送消息是一样的,也是用发送消息(找一下进程和窗体,然后再发送特定的消息)来进行通知程序。CreateFile这些倒是没有什么问题的。
      

  3.   

    由于新创建的线程没有被VB初始化,所以访问VB对象时经常会出错,但有些时候又没有问题,很难找到规律。所以一般不敢用。写驱动主要是为了极高精度要求的情况,现在看起来你还不需要那种精度。
    现在想起来,如果你用定时器只是为了检查串口有没有数据,那么可以这样:在死循环中检查端口数据,只不过每次循环都调用一下DoEvents处理一下界面事件。
    虽然这样循环检查很占CPU资源,但总比优先级为15的多媒体定时器占的CPU资源少。
      

  4.   

    不对吧,用循环和DoEvents虽然是比较快,但是这样的话CPU占用率是100%可是使用多媒体定时器的话,占用率很低,这怎么解释??在任务管理器中明显显示的。
      

  5.   

    循环DoEvents是的线程优先级低,其他线程可抢夺他的CPU资源。
    多媒体定时器利用内核特性,CPU占用率与[System Idle]算在一起。由于它的优先级极高,能很明显的干扰其他程序性能。任务管理器的CPU占用率只能用来看用户进程的CPU占用率。
    内核的CPU占用率就是[System Idle],就算内核独占CPU,任务管理器还是会显示CPU占用率为0%(当前CPU占用率 = 1 - [System Idle]的CPU占用率)
    这就是在复制文件的时候,明明CPU占用率很低,但是总感觉很卡的原因(内核在控制文件复制,抢夺CPU资源但看不出来)。
    创建新线程堵塞等待串口数据的办法最好,CPU占用率最低,要不是VB多线程麻烦的话早用了。
    Windows的Timer虽然精度不高,但它能保证时间过了后一定会通知你的程序(虽然有可能过了很久)。Timer的反应速度与当前CPU的繁忙程度有关,如果此时的CPU占用率不高(没有其他高优先级线程抢夺CPU),Timer还是反应很快的。特别是Win2000以后,Timer的最小间隔正好是10ms。现在是WinXP的天下了,Timer的最小间隔是10ms,勉强能用。
      

  6.   

    好好好我现在知道CPU占用率的实际方法和在PCODE编译时VB可以用多线程,只不过只能做为计算线程。但是,我还有一个问题,哪位大虾帮忙解答一下:activeX EXE中实现异步一般方法都是通过把复杂费时,或者是循环不断做的事放入到定时器事件中来实现多线程的异步效果的,除此之外,还有别的方法吗???譬如使用MSCOMM控件的OnComm事件可以吗???
      

  7.   

    晕了,CSDN也不知道怎么搞的,昨天的帖子我今天才看到