我有一个高速采样系统,VB中用
While bExit=False
   采样一次
   Doevents
Wend
在VC中(不知道如何释放资源,只好用sleep(1))
while(bExit)
{
  采样一次;
  Sleep(1);
}
请问两者速度上有何差别,如何保证在vb中实现高速采样且程序不进入死循环?

解决方案 »

  1.   

    Sleep不会释放资源吧,只是暂停执行而已
    VB的代码没有问题,可以满足你的要求
      

  2.   

    Sleep不会释放资源吧,只是暂停执行而已
    VB的代码没有问题,可以满足你的要求
      

  3.   

    速度上有何差别
    \\\\\\\\\\\\\\\\\\\\\\\\速度效率上估计应该和条件的判断上有关系的。
    记得以前在vb版里见一些大虾聊过此类话题,就是关于vc和vb的条件判断效率问题,即vb中无断言,vc中有断言所以效率相对好些。如何保证在vb中实现高速采样且程序不进入死循环
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\这个俄就不清楚了,个人觉得还是在条件上,既然条件处理的得当应该是不会死循环的。
      

  4.   

    我说的死循环是指资源全部被该循环占用,无法进行其它操作,在vc中可用线程解决,vb中好像只能在循环中插入一个doevents了,精度很难提高阿
      

  5.   

    再补充一下,大部分时候 DoEvents=Sleep(0) ……
      

  6.   

    用WinAPI
    PeekMessage
    具体请参考MSDN
      

  7.   

    to  supergreenbean(超级绿豆)
    再补充一下,大部分时候 DoEvents=Sleep(0) ……
    ----------------------
    为什么呢? 我想sleep不过是线程暂停.而vb是单线程的,而实际中如果在一个循环中用了doevents会让vb有空闲执行主消息循环?
    不明白,忘指教.谢了
      

  8.   

    按照MSDN的说法,Sleep(0)就等于把本线程剩余的时间片给其他需要用的线程……
    在调用Sleep之前VB好像会先查看是否有消息需要处理,有的话就调用PeekMessage.TranslateMessage等几个消息处理函数,弄完之后继续Sleep(0)
      

  9.   

    我试了,
    Sleep(0)无法交出系统控制权
      

  10.   

    While TRUE
      Sleep(0)
    Wend
    后,窗口无法移动,关闭!
      

  11.   

    在循环里面加上
    Sleep(1)
    Doevents
    应该可以了吧
      

  12.   

    这样玩玩Option Explicit
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
    Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
    Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As LongPrivate Type POINTAPI
            x As Long
            y As Long
    End Type
    Private Type MSG
        hwnd As Long
        message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End TypePrivate Const PM_NOREMOVE = &H0
    Private Const PM_REMOVE = &H1Private Sub Form_Load()
        Me.Show
        Dim utMsg As MSG
        
        Do
            Do While PeekMessage(utMsg, 0, 0, 0, PM_REMOVE) <> 0
                Call TranslateMessage(utMsg)
                Call DispatchMessage(utMsg)
            Loop
            Sleep (0)
        LoopEnd Sub
      

  13.   

    个人认为dovents是 “call 消息循环”
    如果有消息,比如timer等消息则能正确执行,比如时钟控件映射的WM_TIMER消息等。
    这样就能解释下列
    Private Sub MSComm1_OnComm()
        Dim str As String
        str = MSComm1.Input
        DoEvents
    End Sub
    容易stack overflow的错误,因为dovents的时候,在sub中又"call 消息循环"
    而这时串口数据到达,有调用mscomm1_oncomm函数了
    而sleep(0)却不会, 他相当与SuspendThread功能,这样别的线程因该有更多的机会获取cpu时间片而已. 而vb单线程.所以无动作..
      

  14.   

    这是VC的"交出控制权"的函数。
    while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
      

  15.   

    //而sleep(0)却不会, 他相当与SuspendThread功能
    这一句我实在是弄不明白.VC的程序也没加Sleep(0),也没出什么问题.
    至于你说的函数重入的错误,我想可以这样解决:
    Private Sub MSComm1_OnComm()
        Static Running As Long
        If Running Then Exit Sub
        Running = 1
        Dim str As String
        str = MSComm1.Input
        DoEvents
        Running = 0
    End Sub
      

  16.   

    根本不应该用循环!采用中断方式最可靠!那样资源少!不知道你采集那么高速干吗用?我是做工业控制的,采集速度都没那么高!可以联系我:网上在线  问题解答
    MSN:[email protected]
      

  17.   

    呵呵,各位兄弟不用争了,DoEvents基本上就是消息循环加上Sleep(0),然后再加一点CoFreeUnusedLibary之类的释放资源的函数还有,个人觉得采集这件事情的确用中断方式最可靠,不必担心缓冲区覆盖阿溢出阿这些问题,只是写驱动程序麻烦了点,呵呵
      

  18.   

    //如何保证在vb中实现高速采样且程序不进入死循环
    do '...
    doevents
    sleep(1)
    loop
      

  19.   

    个人认为这种问题(读磁盘什么的)最好使用Active Exe解决
    activeexe是进程外,不会影响当前进程
      

  20.   

    关键是设备不支持中断方式,只提供直接的IO端口读写状态,所以比较两种工具下的精度。精度要求确实很高,比如用于测定两次变化的速度,就需要高精度。
    顺便问下:在loop循环中如果有一个耗时消息动作了(如读硬盘),是否会造成我的采集信息暂时丢失?
      

  21.   

    回复人: ipman(.NET) ( ) 信誉:85  2004-5-12 20:56:21  得分:0 
     
     
      
    多线程难道比单线程来得快?线程切换不是需要时间吗?
    -----------------------------------------------------------
    多线程当然不如单线程快,同一台机器上dos操作系统下的程序就比windows下快的多(只是比喻)
    只是现实很多事不是单线程的