|
今天写代码的时候发现一个问题: 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
|
一共有 0 条评论