Skip to content

VBMAN.Delay - 延迟执行对象

概述

VBMAN.Delay 提供了延迟执行和异步回调功能,可以在指定时间后执行代码,避免阻塞主线程,适用于需要延时操作的场景。

核心特性

  • 非阻塞延迟: 不会冻结界面
  • 回调支持: 支持对象方法回调
  • 可取消: 可以取消待执行的延迟任务
  • 链式调用: 流畅的 API 设计

方法

Callback

设置回调对象和方法

vb
Public Function Callback(ByVal obj As Object, ByVal methodName As String) As cDelay

参数:

  • obj - 回调对象
  • methodName - 要调用的方法名

示例:

vb
' 设置回调
VBMAN.Delay.Callback Me, "DelayedMethod"

CountDown

开始倒计时(毫秒)

vb
Public Function CountDown(ByVal milliseconds As Long) As cDelay

示例:

vb
' 2秒后执行
VBMAN.Delay.Callback(Me, "ShowMessage").CountDown 2000

' 5秒后执行
VBMAN.Delay.Callback(Me, "AutoSave").CountDown 5000

综合示例

示例1: 延迟显示消息

vb
' 在窗体模块中
Public Sub ShowDelayedMessage()
    VBMAN.Delay.Callback Me, "ShowWelcome"
    VBMAN.Delay.CountDown 1000
End Sub

Public Sub ShowWelcome()
    MsgBox "欢迎使用本系统!"
End Sub

' 使用
Private Sub Form_Load()
    ShowDelayedMessage
End Sub

示例2: 异步显示主窗体(来自 cs-auther 案例)

vb
' 异步显示主窗体的原因:
' 因为 bUser.Info 在 TCP 接收处理器内部执行,而 fLogin 也监听了 TCP 事件。
' 如果直接在 Info 中 Unload fLogin,会引发事件重入冲突。
' 因此使用 VBMAN.Delay.Callback(Me, "ShowMainForm").CountDown 2000 延迟 2 秒后异步执行。

Public Sub ShowMainForm()
    fLogin.Hide
    Form1.Show
End Sub

' 在登录成功后调用
Private Sub LoginSuccess()
    VBMAN.Delay.Callback(Me, "ShowMainForm").CountDown 2000
End Sub

示例3: 自动保存功能

vb
Private Sub TextEditor_Change()
    ' 内容改变后,3秒后自动保存
    VBMAN.Delay.Callback(Me, "AutoSave").CountDown 3000
End Sub

Public Sub AutoSave()
    ' 保存文件
    SaveFile TextEditor.Text, CurrentFilePath
    VBMAN.Toast.Show "已自动保存", 1000
End Sub

示例4: 重试机制

vb
Private retryCount As Integer

Private Sub ConnectToServer()
    If Not TryConnect() Then
        retryCount = retryCount + 1
        If retryCount <= 3 Then
            VBMAN.Toast.Show "连接失败," & retryCount & "秒后重试...", 2000
            VBMAN.Delay.Callback(Me, "ConnectToServer").CountDown retryCount * 1000
        Else
            MsgBox "连接失败,请检查网络设置"
        End If
    End If
End Sub

示例5: 延时关闭

vb
Private Sub ShutdownWithDelay()
    VBMAN.Toast.Show "系统将在5秒后关闭", 5000
    VBMAN.Delay.Callback(Me, "DoShutdown").CountDown 5000
End Sub

Public Sub DoShutdown()
    ' 执行清理操作
    Cleanup
    
    ' 关闭程序
    Unload Me
End Sub

最佳实践

  1. 避免循环调用: 注意防止无限递归的延时调用
  2. 对象生命周期: 确保回调对象在延时执行时仍然存在
  3. 线程安全: 在多线程环境中使用时注意线程安全
  4. 错误处理: 回调方法中添加错误处理
  5. 适时取消: 如果不再需要延时执行,及时取消

VB6及其LOGO版权为微软公司所有