如何立即退出程序?

时间:2009-08-12 06:29:46

标签: vb6

使用VB 6和Access 2003

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

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

在“处理”按钮中,我编写了如下代码:

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

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

在“取消”按钮中,我编写了此代码

Unload me

如何在使用数据库时立即退出程序?

需要VB 6代码帮助

4 个答案:

答案 0 :(得分:8)

它可能挂起的另一个原因是因为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 - 虽然看似笨拙的机制,它确实很好用。在整个过程中撒上一些,你应该注意到一些改进。虽然可能不完美,但可能还不错。

e.g。

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

答案 1 :(得分:4)

尝试:

End

答案 2 :(得分:4)

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

答案 3 :(得分:-1)

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