一个很好的延时类,在某些时候比timer更易用,不易假死
### 延时类clsWaitableTimer的知识点详解 #### 一、概述 根据所提供的信息,我们可以了解到这是一个基于`clsWaitableTimer`类实现的延时功能模块,它相较于传统的`Timer`控件具备更好的稳定性和灵活性。在某些场景下(如需要精确控制延迟时间或者避免程序假死的情况),`clsWaitableTimer`可以提供更为优秀的解决方案。 #### 二、基本原理与API介绍 `clsWaitableTimer`是通过Windows API中的`CreateWaitableTimer`、`SetWaitableTimer`等函数来实现延时功能的。这些API允许开发者创建可等待的定时器对象,并设置其触发条件,从而实现精确的延时操作。 ##### 1. `CreateWaitableTimer` 用于创建一个新的可等待定时器对象。 - **参数**: - `lpSemaphoreAttributes`:长整型,用于指定对象的安全属性。 - `bManualReset`:布尔值,指明定时器是否为手动重置类型。 - `lpName`:字符串,定时器对象的名字。 ##### 2. `SetWaitableTimer` 用于设置可等待定时器的到期时间和周期。 - **参数**: - `hTimer`:长整型,定时器句柄。 - `lpDueTime`:结构体`FILETIME`,到期时间。 - `lPeriod`:长整型,周期时间。 - `pfnCompletionRoutine`:长整型,完成例程的地址。 - `lpArgToCompletionRoutine`:长整型,传递给完成例程的数据。 - `fResume`:长整型,指明是否应恢复暂停的线程。 ##### 3. `CancelWaitableTimer` 用于取消一个已设置的可等待定时器。 - **参数**: - `hTimer`:长整型,定时器句柄。 ##### 4. `CloseHandle` 用于关闭一个已经打开的对象句柄。 - **参数**: - `hObject`:长整型,对象句柄。 ##### 5. `WaitForSingleObject` 用于等待单个对象变为指定状态。 - **参数**: - `hHandle`:长整型,对象句柄。 - `dwMilliseconds`:长整型,等待的时间。 ##### 6. `MsgWaitForMultipleObjects` 用于等待多个对象变为指定状态,同时监听消息队列。 - **参数**: - `nCount`:长整型,对象数量。 - `pHandles`:长整型数组,对象句柄数组。 - `fWaitAll`:长整型,是否等待所有对象。 - `dwMilliseconds`:长整型,等待的时间。 - `dwWakeMask`:长整型,唤醒掩码。 #### 三、使用范例分析 ```vb Private Sub Command1_Click() Dim objTimer As New clsWaitableTimer objTimer.Wait 5000 Set objTimer = Nothing End Sub ``` 在示例代码中,首先创建了一个`clsWaitableTimer`类型的对象`objTimer`。然后调用`Wait`方法,使得当前线程等待5000毫秒(即5秒)。最后将`objTimer`对象设置为`Nothing`,释放资源。 #### 四、关键常量解析 - **WAIT_ABANDONED**: 定义了线程放弃对某个对象的所有权的状态。 - **WAIT_FAILED**: 指明等待操作失败。 - **WAIT_IO_COMPLETION**: I/O完成端口的事件被触发。 - **WAIT_OBJECT_0**: 第一个等待对象变为可等待状态。 - **WAIT_OBJECT_1**: 第二个等待对象变为可等待状态。 - **WAIT_TIMEOUT**: 指明等待超时。 - **INFINITE**: 无限等待。 - **ERROR_ALREADY_EXISTS**: 错误代码,表示对象已存在。 - **QS_HOTKEY**: 指定等待热键消息。 - **QS_KEY**: 指定等待键盘消息。 - **QS_MOUSEBUTTON**: 指定等待鼠标按钮消息。 - **QS_MOUSEMOVE**: 指定等待鼠标移动消息。 - **QS_PAINT**: 指定等待绘图消息。 - **QS_POSTMESSAGE**: 指定等待发送消息。 - **QS_SENDMESSAGE**: 指定等待发送消息完成。 - **QS_TIMER**: 指定等待计时器消息。 - **QS_MOUSE**: 结合鼠标移动和鼠标按钮消息。 - **QS_INPUT**: 结合键盘和鼠标消息。 - **QS_ALLEVENTS**: 结合所有输入和计时器、绘图、热键消息。 - **QS_ALLINPUT**: 结合所有可能的消息。 #### 五、应用场景 1. **精确延时**:在需要精确控制延时时间的场景下使用,例如游戏开发中的帧同步。 2. **避免程序假死**:当需要延时时,使用`clsWaitableTimer`代替传统的`DoEvents`或`Sleep`方法,可以有效防止程序卡顿或假死。 3. **多线程任务调度**:在多线程环境中,可以利用`clsWaitableTimer`实现线程间的同步或异步通信。 `clsWaitableTimer`是一个功能强大的延时类,它不仅提供了比传统`Timer`控件更灵活的延时控制机制,而且还能够有效提高程序的稳定性和响应性。通过对上述知识点的掌握,开发者可以在实际项目中更加高效地利用此类进行延时控制。
Option Explicit
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Const WAIT_ABANDONED& = &H80&
Private Const WAIT_ABANDONED_0& = &H80&
Private Const WAIT_FAILED& = -1&
Private Const WAIT_IO_COMPLETION& = &HC0&
Private Const WAIT_OBJECT_0& = 0
Private Const WAIT_OBJECT_1& = 1
Private Const WAIT_TIMEOUT& = &H102&
Private Const INFINITE = &HFFFF
Private Const ERROR_ALREADY_EXISTS = 183&
Private Const QS_HOTKEY& = &H80
Private Const QS_KEY& = &H1
Private Const QS_MOUSEBUTTON& = &H4
Private Const QS_MOUSEMOVE& = &H2
Private Const QS_PAINT& = &H20
Private Const QS_POSTMESSAGE& = &H8
Private Const QS_SENDMESSAGE& = &H40
Private Const QS_TIMER& = &H10
Private Const QS_MOUSE& = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Private Const QS_INPUT& = (QS_MOUSE Or QS_KEY)
Private Const QS_ALLEVENTS& = (QS_INPUT Or QS_POSTMESSAGE Or QS_TIMER Or QS_PAINT Or QS_HOTKEY)
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)
- 粉丝: 1324
- 资源: 242
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 代码审计知识点整理-Java.zip
- 从 Python 访问 Java 类.zip
- 交互式 JavaScript 沙箱.zip
- 交互式 JavaScript API 参考.zip
- 使用SSM框架的Java Web项目-电商后台管理.zip
- ffmpeg、ffplay、ffprobe
- 与 FrontendMasters 课程 JavaScript 和 React 模式相关的 repo.zip
- win11系统有ie浏览器,打开ie浏览器自动跳转edge浏览器解决方案
- 基于Spark的新闻推荐系统源码+文档说明(高分项目)
- 27个常用分布函数详细汇总-名称+类别+用途+概率密度曲线+公式-PPT版本
- 1
- 2
- 3
前往页