我有一个高速采样系统,VB中用
While bExit=False
采样一次
Doevents
Wend
在VC中(不知道如何释放资源,只好用sleep(1))
while(bExit)
{
采样一次;
Sleep(1);
}
请问两者速度上有何差别,如何保证在vb中实现高速采样且程序不进入死循环?
While bExit=False
采样一次
Doevents
Wend
在VC中(不知道如何释放资源,只好用sleep(1))
while(bExit)
{
采样一次;
Sleep(1);
}
请问两者速度上有何差别,如何保证在vb中实现高速采样且程序不进入死循环?
VB的代码没有问题,可以满足你的要求
VB的代码没有问题,可以满足你的要求
\\\\\\\\\\\\\\\\\\\\\\\\速度效率上估计应该和条件的判断上有关系的。
记得以前在vb版里见一些大虾聊过此类话题,就是关于vc和vb的条件判断效率问题,即vb中无断言,vc中有断言所以效率相对好些。如何保证在vb中实现高速采样且程序不进入死循环
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\这个俄就不清楚了,个人觉得还是在条件上,既然条件处理的得当应该是不会死循环的。
PeekMessage
具体请参考MSDN
再补充一下,大部分时候 DoEvents=Sleep(0) ……
----------------------
为什么呢? 我想sleep不过是线程暂停.而vb是单线程的,而实际中如果在一个循环中用了doevents会让vb有空闲执行主消息循环?
不明白,忘指教.谢了
在调用Sleep之前VB好像会先查看是否有消息需要处理,有的话就调用PeekMessage.TranslateMessage等几个消息处理函数,弄完之后继续Sleep(0)
Sleep(0)无法交出系统控制权
Sleep(0)
Wend
后,窗口无法移动,关闭!
Sleep(1)
Doevents
应该可以了吧
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
如果有消息,比如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单线程.所以无动作..
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
这一句我实在是弄不明白.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
MSN:[email protected]
do '...
doevents
sleep(1)
loop
activeexe是进程外,不会影响当前进程
顺便问下:在loop循环中如果有一个耗时消息动作了(如读硬盘),是否会造成我的采集信息暂时丢失?
多线程难道比单线程来得快?线程切换不是需要时间吗?
-----------------------------------------------------------
多线程当然不如单线程快,同一台机器上dos操作系统下的程序就比windows下快的多(只是比喻)
只是现实很多事不是单线程的