设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4497|回复: 4
打印 上一主题 下一主题

vb中关于延时的方法

[复制链接]

60

主题

8

好友

1161

积分

金牌会员

Rank: 6Rank: 6

生肖
星座
处女座
性别

最佳新人 活跃会员 灌水之王 论坛元老

跳转到指定楼层
楼主
发表于 2012-6-6 19:10:47 |只看该作者 |倒序浏览
本帖最后由 sky_yx 于 2015-12-30 14:19 编辑

有时候程序中 一句代码执行完毕后不需要立即执行下一句代码 中间需要延时 比如 模拟按键再按下和弹起中间加一个0.1秒的延时  再或者需要一个小动画 帧与帧之间也需要一个延时 用到的地方还有很多
我一般延时使用的是
    Dim t As Single
    t = Timer
    Do While Timer - t < 0.1
        DoEvents
    Loop
这样来达到延时的目的  不过貌似系统资源会使用的很多我上次一个循环的判断 中间加了一个延时 电脑cpu直接50%了
还有使用api sleep延时   这时候线程会被挂起来饿、、 vb这个单线程挂起来了可想而知,,直接无响应了
最后我还使用过timer控件来达到延时的目的 不过就是太麻烦了饿。。。
能不能就想易语言里面的延时一样即能延时又不会无响应 而且不会过分的占用系统资源呢?  求各位大牛详解 不胜感激

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享淘帖0 收藏收藏0 评分评分
你老婆要生了。我要当爹了

60

主题

8

好友

1161

积分

金牌会员

Rank: 6Rank: 6

生肖
星座
处女座
性别

最佳新人 活跃会员 灌水之王 论坛元老

沙发
发表于 2012-6-6 20:56:47 |只看该作者
本帖最后由 sky_yx 于 2015-12-30 14:19 编辑

写了个函数  延时还不错 调用 方法 s 毫秒
  1. Public Function s(ByVal timer As Long)
  2.     t = timer / 10
  3.     For i = 1 To t
  4.         DoEvents
  5.         Sleep (10)
  6.     Next i
  7. End Function
复制代码


你老婆要生了。我要当爹了
回复

使用道具 评分 举报

60

主题

8

好友

1161

积分

金牌会员

Rank: 6Rank: 6

生肖
星座
处女座
性别

最佳新人 活跃会员 灌水之王 论坛元老

板凳
发表于 2012-6-7 19:26:28 |只看该作者
本帖最后由 sky_yx 于 2015-12-30 14:19 编辑

用这个 类 很不错 cpu 占用“基本”没有   也没有假死

  1. Option Explicit
  2. Private Type FILETIME
  3. dwLowDateTime As Long
  4. dwHighDateTime As Long
  5. End Type
  6. Private Const WAIT_ABANDONED& = &H80&
  7. Private Const WAIT_ABANDONED_0& = &H80&
  8. Private Const WAIT_FAILED& = -1&
  9. Private Const WAIT_IO_COMPLETION& = &HC0&
  10. Private Const WAIT_OBJECT_0& = 0
  11. Private Const WAIT_OBJECT_1& = 1
  12. Private Const WAIT_TIMEOUT& = &H102&
  13. Private Const INFINITE = &HFFFF
  14. Private Const ERROR_ALREADY_EXISTS = 183&
  15. Private Const QS_HOTKEY& = &H80
  16. Private Const QS_KEY& = &H1
  17. Private Const QS_MOUSEBUTTON& = &H4
  18. Private Const QS_MOUSEMOVE& = &H2
  19. Private Const QS_PAINT& = &H20
  20. Private Const QS_POSTMESSAGE& = &H8
  21. Private Const QS_SENDMESSAGE& = &H40
  22. Private Const QS_TIMER& = &H10
  23. Private Const QS_MOUSE& = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
  24. Private Const QS_INPUT& = (QS_MOUSE Or QS_KEY)
  25. Private Const QS_ALLEVENTS& = (QS_INPUT Or QS_POSTMESSAGE Or QS_TIMER Or QS_PAINT Or QS_HOTKEY)
  26. Private Const QS_ALLINPUT& = (QS_SENDMESSAGE Or QS_PAINT Or QS_TIMER Or QS_POSTMESSAGE Or QS_MOUSEBUTTON Or QS_MOUSEMOVE Or QS_HOTKEY Or QS_KEY)
  27. Private Const UNITS = 4294967296#
  28. Private Const MAX_LONG = -2147483648#
  29. Private Declare Function CreateWaitableTimer _
  30. Lib "kernel32" _
  31. Alias "CreateWaitableTimerA" (ByVal lpSemaphoreAttributes As Long, _
  32. ByVal bManualReset As Long, _
  33. ByVal lpName As String) As Long
  34. Private Declare Function OpenWaitableTimer _
  35. Lib "kernel32" _
  36. Alias "OpenWaitableTimerA" (ByVal dwDesiredAccess As Long, _
  37. ByVal bInheritHandle As Long, _
  38. ByVal lpName As String) As Long
  39. Private Declare Function SetWaitableTimer _
  40. Lib "kernel32" (ByVal hTimer As Long, _
  41. lpDueTime As FILETIME, _
  42. ByVal lPeriod As Long, _
  43. ByVal pfnCompletionRoutine As Long, _
  44. ByVal lpArgToCompletionRoutine As Long, _
  45. ByVal fResume As Long) As Long
  46. Private Declare Function CancelWaitableTimer Lib "kernel32" (ByVal hTimer As Long)
  47. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  48. Private Declare Function WaitForSingleObject _
  49. Lib "kernel32" (ByVal hHandle As Long, _
  50. ByVal dwMilliseconds As Long) As Long
  51. Private Declare Function MsgWaitForMultipleObjects _
  52. Lib "user32" (ByVal nCount As Long, _
  53. pHandles As Long, _
  54. ByVal fWaitAll As Long, _
  55. ByVal dwMilliseconds As Long, _
  56. ByVal dwWakeMask As Long) As Long
  57. Private mlTimer As Long
  58. Private Sub Class_Terminate()
  59.     On Error Resume Next
  60.     If mlTimer <> 0 Then CloseHandle mlTimer
  61. End Sub
  62. Public Sub Wait(MilliSeconds As Long)
  63.     On Error GoTo ErrHandler
  64. Dim ft As FILETIME
  65. Dim lBusy As Long
  66. Dim lRet As Long
  67. Dim dblDelay As Double
  68. Dim dblDelayLow As Double
  69. mlTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer" & Format$(Now(), "NNSS"))
  70. If Err.LastDllError <> ERROR_ALREADY_EXISTS Then
  71. ft.dwLowDateTime = -1
  72. ft.dwHighDateTime = -1
  73. lRet = SetWaitableTimer(mlTimer, ft, 0, 0, 0, 0)
  74. End If
  75. dblDelay = CDbl(MilliSeconds) * 10000#
  76. ft.dwHighDateTime = -CLng(dblDelay / UNITS) - 1
  77. dblDelayLow = -UNITS * (dblDelay / UNITS - Fix(CStr(dblDelay / UNITS)))
  78. If dblDelayLow < MAX_LONG Then dblDelayLow = UNITS + dblDelayLow
  79. ft.dwLowDateTime = CLng(dblDelayLow)
  80. lRet = SetWaitableTimer(mlTimer, ft, 0, 0, 0, False)
  81. Do
  82. lBusy = MsgWaitForMultipleObjects(1, mlTimer, False, INFINITE, QS_ALLINPUT&)
  83. DoEvents
  84. Loop Until lBusy = WAIT_OBJECT_0
  85. CloseHandle mlTimer
  86. mlTimer = 0
  87. Exit Sub
  88. ErrHandler:
  89. Err.Raise Err.Number, Err.Source, "[clsWaitableTimer.Wait]" & Err.Description
  90. End Sub
复制代码


你老婆要生了。我要当爹了
回复

使用道具 评分 举报

0

主题

0

好友

112

积分

注册会员

Rank: 2

性别
保密
地板
发表于 2013-11-22 09:48:16 |只看该作者
本帖最后由 sky_yx 于 2015-12-30 14:19 编辑

哈哈,厉害,我以前 sleep 1  这样基本看不出假死

回复

使用道具 评分 举报

0

主题

0

好友

112

积分

注册会员

Rank: 2

性别
保密
5#
发表于 2013-11-22 09:49:24 |只看该作者
本帖最后由 sky_yx 于 2015-12-30 14:19 编辑

你等级都那么高了  

回复

使用道具 评分 举报

您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-4-27 12:18 , Processed in 0.134220 second(s), 26 queries .

回顶部