VB中延时功能与Sleep函数
发布时间:2022-01-06, 18:19:10 分类:VB | 编辑 off 网址 | 辅助
正文 1142字数 648,235阅读
延时-Sleep函数,主要功能就是使当前线程等待一段时间,用法就是“Sleep 毫秒数”,这里的毫秒数可以设置成任意整型数据。如 Sleep 1000,表示延时1秒(1000毫秒)。
Sleep与DoEvents之间是有点区别的。DoEvents其实是将CPU的控制权交出去,是为了在长循环中进程占据全部CPU资源,也就是相当于一种事件,网上有这样的说法:DoEvents就是把机会让给别的事件,自己暂时休息一下,但是占着的位置不会空出来。
在死循环里放个DoEvents,CPU占用率是100%,同时这个进程还是可以做别的事情的。而Sleep前面也讲过了,就是使当前线程等待一段时间的,英文单词表面上理解也可以理解成“睡觉”的意思,也就是什么都不做了,也不会占着CPU资源的,当然进程也是什么事都不干的。
举个小例子:
Dim a As Integer
Dim b As Integer
Dim i As Integer
a=Text1.Text
b=Text2.Text
If a<>b Then
For i = 1 To 30
PlaySound App.Path & /music.mid '这里的PlaySound是一个函数,由于与本主题无关,不写出来了。
Sleep 1000 '延时1秒
Next
End If
Run code
Cut to clipboard
这就是一个简单的延时程序示例,用到了Sleep函数。(其实这时是变相的使用Sleep函数,可以实现音乐的循环播放,当然音乐的长度要跟延时长度有关,要不然可能效果不好)当然我们也可以用一个循环语句来实现Sleep函数功能,如下:
Sub wait(i As Integer)
Dim s As Integer
Dim j As Integer
Dim k As Integer
For j = 0 To i
For k = 0 To 1000
s = s
Next k
Next j
End Sub
Run code
Cut to clipboard
在调用的时候直接写上wait(1000)就可以实现与Sleep函数差不多的功能了,当然,可能在某种程度上来说,这个函数的效率并没有Sleep函数强,但也值得一用。
忘记了,补上API声明,要不然无法使用。
Private Declare Sub Sleep Lib Kernel32 (ByVal dwMilliseconds As Long) '-----Sleep函数
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
有过 2 条评论 »
Form_Load()中先初始化控件参数 WithMSComm1 .Settings="9600,N,8,1" .InputMode=1 '设置接受数据的类型是二进制类型数据 .InputLen=8 '一次性从接收缓冲区中读取所有数据(8个字节为一组) .InBufferCount=0 '清空接收缓冲区 .OutBufferCount=0 '清空发送缓冲区 .SThreshold=0 '一旦发送数据就触发OnComm()事件来检测是否返回数据 .RThreshold=1 '接收到1个字节数据就立即触发OnComm()事件 .CommPort=1 '使用第一个串口 .PortOpen=True '打开串口 EndWith
这是个很头痛的问题,3个月了,我一直想找出VB为什么接收缓冲区中可以接收很多字节,但是却不能一次性自动读出的问题。经过大量的实验!用过分次读出,单个读出的办法,感觉都很慢,没效率,分组读出的方法不好用于CANBUS组网,单个读出的方法,有时候处理过程中会丢失数据而且每个字节都触发事件,浪费资源!按网上的方法,加大过接收缓冲区,但是加到最大最大,还是不能一次读出20个数据,比原来增大了,还是不够用,对于小于16个的应该可以采用,也是个解决的办法,但是有局限性!
开始总想着是自己程序问题,学艺不精!后来在网上看到很多人也在研究这问题,看到他们的程序都没错,感觉不是人的问题,是这种com口控件自身的问题,由于串口已经快淡出历史舞台了,用的人也很少,只是有些工业机传输些少量的通讯数据而已!所以,估计不会引起软件公司的重视,有问题就有问题吧,没效益的事谁干?
个人拙见,应该是接收缓冲区没问题,问题在于MSComm1.RThreshold的设定值大于8以后不到设定值就提前触发MSComm1_OnComm()的动作或者乱动作,反正如果比成人的大脑就是神经错乱,不听话了!
所以我想了笨方法就是在MSComm1.RThreshold上设置小于8的值,我设成6,66大顺,哈哈,本人有点唯心哈!然后在MSComm1_OnComm()事件的MSComm1.Input前加延时,虽然笨,但是经过调试,感觉比分段读出,和单个读出效率多了,而且不会丢失数据,也不会产生分段读出在多个设备并网的情况下找错对象!我最多用到一次读出59个字节,如果字节多,不能一次读出,还可以增加延时,VB源程序代码如下:
Private Declare Sub Sleep Lib "kernel32 " (ByVal dwMilliseconds As Long) Private Sub CommInit() Call Commsetting(FirstCOM, FirstComSet) MSComm1.InputMode = 1 ' comInputModeBinary '//以二进制方式读数据 MSComm1.InputLen = 0 '//设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据 MSComm1.InBufferSize = 512 '//设置接收缓冲区512 Byte MSComm1.InBufferCount = 0 MSComm1.OutBufferSize = 512 '//设置发送缓冲区512 Byte MSComm1.OutBufferCount = 0 MSComm1.RThreshold = 6 'InputDataLen '//n个字符到接收缓冲区都触发接收事件 MSComm1.SThreshold = 0 'OutputDataLen End Sub Private Sub MSComm1_OnComm() Dim ComDATA() As Byte Dim temp As String Dim i As Integer On Error GoTo ErrOnCom If DisReceive = True Then Exit Sub End If Select Case MSComm1.CommEvent Case comEvReceive Sleep 100 ComDATA = MSComm1.Input For i = 0 To UBound(ComDATA) InputData(i) = ComDATA(i) Next i End Select End Sub
程序不全,只是中间截取,仅供参考
shell "explorer.exe ""c:\abc""",vbnormalfocus
vb点击关闭按钮时窗体隐藏
vb点击关闭按钮时会产生 UnloadMode = 0,可以通过它来判断实现
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If UnloadMode = 0 Then Me.Hide Cancel = 1 End if End Sub
用VB打开网页
Shell "explorer.exe http://www.baidu.com"
VB6系统托盘.zip