【问题标题】:How to exit the program immediately?如何立即退出程序?
【发布时间】:2009-08-12 06:29:45
【问题描述】:

使用 VB 6 和 Access 2003

我正在使用两个命令按钮(处理、取消)

当我运行程序时,按取消按钮 – 表单会立即卸载。
如果我按下处理按钮,然后按下取消按钮,表单不会立即卸载。

在处理按钮中,我写了这样的代码:

Getting the data from the database and creating a record set, creating a temporary table…,

有没有什么办法可以在VB代码处理数据库时立即退出程序(比如创建记录集、创建临时表)?

在取消按钮中,我写了这段代码

Unload me

程序在处理数据库时如何立即退出?

需要 VB 6 代码帮助

【问题讨论】:

    标签: vb6


    【解决方案1】:

    它可能挂起的另一个原因是因为 VB6 正在等待数据库。您在数据库上运行的查询是长时间运行的,还是需要很长时间的 VB6 代码?

    如果数据库查询导致问题并且您使用的是 ADO,则可以使用异步数据库连接。代码的逻辑可能会更复杂,因为您必须设置回调方法才能在每个数据库调用完成后继续处理。

    你可以像这样建立这样的连接:

    Private WithEvents m_conn As ADODB.Connection
    ...
    Set m_conn = New ADODB.Connection
    Call m_conn.Open(connectionString, , , adAsyncConnect)
    

    像这样执行查询/存储过程 - 您会注意到这里的主要区别是,在查询完成之前不会挂起,而是继续正常执行代码):

    sql = "SELECT Col1 FROM etc. etc."
    Call m_conn.Execute(sql, , adAsyncExecute)
    

    像这样取消正在运行的查询:

    Call m_conn.cancel
    

    以及查询完成时的所有重要回调:

    Private Sub m_conn_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
        ... do more processing etc...
    End Sub
    

    您可能会发现上述内容对于您想要的东西来说太过分了;我只是自己实现的,因为该窗口是专门为执行长时间运行的查询而设计的,并且窗口保持响应并允许在中途取消查询非常重要。

    不过,据我所知,如果您不使用异步查询方法,VB6 将保持无响应,直到您的m_conn.Execute 方法返回。

    如果由于 VB6 代码本身而发生延迟 - 例如在您创建临时表的所有工作中,那么我会同意 MarkJ 的“经典”答案并使用 DoEvents - 尽管看似笨拙的机制,它确实工作得很好。在整个过程中撒上一些,您应该会注意到一些改进。虽然可能并不完美,但可能已经足够了。

    例如

    retrieve results
    ...
    DoEvents
    ...
    build temporary tables
    ...
    DoEvents
    

    每次点击 DoEvents 块之一时,如果用户单击了代码应该触发的“取消”按钮。

    注意:您可能还想对在代码仍在运行时卸载表单有点谨慎,我不相信一切都会正确卸载。在这种情况下,您可能想要这样的东西:

    Private m_cancel as Boolean
    
    Private Sub cmdCancel_Click()
        m_cancel = True
    End Sub
    
    Private Sub cmdProcess_Click()
        ...
        retrieve results
        ...
        DoEvents
        If Not m_cancel Then
            ... build temporary tables etc...
        End if
    
        If m_cancel Then Unload Me
    End Sub
    

    【讨论】:

      【解决方案2】:

      试试:

      结束

      【讨论】:

      • 可能没有帮助,听起来“处理”正在阻塞,并且 Click 事件在处理完成之前不会触发。
      • 简单规则:从不在 VB6 中使用End。它会杀死你的程序,而没有给它一个优雅退出的机会。
      • 由于其中一些答案有很多很好的解决方案,这实际上是only 答案,它实际上“回答”了原始问题。
      【解决方案3】:

      问题可能是取消按钮 Click 事件没有触发,因为您的单线程正忙于处理。

      【讨论】:

        【解决方案4】:

        很快,在处理按钮的代码中编写更多的 DoEvents。
        或者使用 DoEvents 的替代代码,它比 DoEvents 更好更快。 http://nirsoft.net/vb/doevents.html

        【讨论】:

        • 这个答案如何扩展 3 年前发布并接受的 other answers,两者都已经建议 DoEvents
        • 这里是替代代码,效果更好。不相信?试试;)
        • 如何更好?它与真正的DoEvents() 几乎完全相同,除了Sleep(0)。不要只是张贴并说“这更好”,请尝试备份您的声明并提供证据和参考,尤其是链接页面并没有说它更好(甚至有一些限制)。
        • 我不知道你在说什么,但是我尝试了这段代码,它更好,因为DoEvents有时会挂起应用程序,但这段代码运行良好......
        • DoEvents 本身不会挂起应用程序,因为它所做的只是一个消息泵,让 Windows 做它的事情。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多