博主资料

留言 加为好友 收藏

用户名:  xiumuzidiao

个人统计

用户名: xiumuzidiao
等级: 初来乍到
威望: 90
积分: 205
在线时间: 4 小时
日志总数: 24
评论数量: 24
访问次数: 107804
建立时间: 2007-04-12
RSS订阅       手机访问

最新评论

文章搜索

文章列表

友情链接

最近访问的人:

百奥谷|百奥谷SEO..
2008-04-30 17:20:24
Developer
2007-12-07 11:21:44
学习IT
2007-12-05 13:25:51
不断进步的我
2007-10-10 08:03:43
老杳吧:LAOYAOBA..
2007-10-09 01:23:34

日志文章

2007年04月13日 03:00:28

vb中几种延时的处理方法

今天写代码的时候发现一个问题:
sxs.exe是SHA(+S 系统文件 +A存档文件 +H隐藏文件 +r只读文件)的文件,所以要删除之前必须得先-s -a -h。但是发现程序需要运行两次才能把他删除掉,经过几次测试发现是在去掉属性的时候需要一些时延才能删除,这段时延应该是系统用来处理的时间,那么就需要考虑我的程序也需要时延来同步或者等待。

有以下方法:

1.使用Windows API函数Sleep
新建一个工程,添加一个TextBox控件和一个CommandButton控件,再将以下代码复制到代码窗口
'声明:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
Text1.text = "开始时延3秒"
Sleep 3000
Text1.text = "时延3秒结束"
End Sub



2.使用Timer()函数
这是用的最多的一种方法,也是在VB联机手册中所推荐的。添加一个CommandButton控件,再将以下代码添加到代码窗口中:

Private Sub Command2_Click()
Dim Savetime As Single
Text1 = "Timer begin"
Savetime = Timer '记下开始的时间
While Timer < Savetime + 5 '循环等待
DoEvents '转让控制权,以便让操作系统处理其它的事件。 -----这个的功能差不多等于挂起,并且等待系统回应后把控制权返还
Wend
Text1 = "Timer ok"
End Sub

这种方法虽然也很简单,但却有有一个致命缺陷,那就是Timer函数返回的是从午夜开始到现在经过的秒数。所以Timer返回的最大值也只是60*60*24-1秒,如果从一天的23:59:58秒开始计时等待5秒,那么程序会永远地循环下去。要进行改良,就要加上判断是否又开始了新的一天,那岂不是太麻烦.


//上面一段是网上找的资料,其实可以不用timer函数,而是使用timer控件或者second函数,但是second函数如果是在第55秒后延长5秒的话,也需要做到上面说的新的一分钟的判断,那也麻烦.当然,你也可以修改系统的时间,把他改在55秒前,总之还是麻烦。因此可以考虑用timer函数.创建一个flag(标志),初始化flag为0,用timer每秒flag+1,当flag2=flag1+5的时候清零,根据条件判断执行下一命令 和 是否继续执行循环。大概的代码是:

dim flag1,flag2 as integer'该定义应该放在最最最上面,flag是全局

'这部分可以放在command按下按扭的时候,或者onload
flag1=0
flag2=flag1+5

'timer1部分
if flag2 <> flag1 then
flag1=flag1+1
print flag1
exit sub
else
'flag1=0
timer1.enabled=false
'先清零再做其他事情,包括中断 timer1.enabled=false等

end if
(代码可用)

上面的代码甚至可以一秒判断一次执行一个不同的命令

if flag2 <> flag1 then
' new part
select case flag1
case 1: 'Express 1 while the first second
case 2: 'Express 2 while the second second
case 3: 'Express 3 while the third second
case 4: 'Express 4 while the fourth second
....
end select
flag1=flag1+1
exit sub

else
'flag1=0
timer1.enabled=false
'先清零再做其他事情,包括中断 timer1.enabled=false等

end if



3.使用Windows API函数timeGetTime()
timeGetTime函数没有参数,返回值是从开机到现在所经历的毫秒数,这个毫秒数是非周期性递增的,所以不会出现Timer()函数出现的问题,而且这种方法的精确性高于上一种方法。添加一个CommandButton控件,再将以下代码添加到代码窗口中:
'声明
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Command3_Click()
Dim Savetime As Double
Text1 = "timeGetTime begin"
Savetime = timeGetTime '记下开始时的时间
While timeGetTime < Savetime + 5000 '循环等待
DoEvents '转让控制权,以便让操作系统处理其它的事件。
Wend
Text1 = "timeGetTime end"
End Sub


类别: Visual Basic笔记 |  评论(0) |  浏览(1969) |  收藏
-20楼 [楼主][匿名] Says:
-21楼 [楼主][匿名] Says:
-22楼 [楼主][匿名] Says:
-23楼 [楼主][匿名] Says:
-24楼 [楼主][匿名] Says:
-25楼 [楼主][匿名] Says:
-26楼 [楼主][匿名] Says:
-27楼 [楼主][匿名] Says:
-28楼 [楼主][匿名] Says:
-29楼 [楼主][匿名] Says:
发表评论