首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何立即退出程序?

问如何立即退出程序?
EN

Stack Overflow用户
提问于 2009-08-12 06:29:46
回答 3查看 26.5K关注 0票数 3

使用VB6和Access 2003

我使用两个命令按钮(process、cancel)

当我运行程序时,按下取消按钮-表单立即卸载。

如果我按“处理”按钮,然后按“取消”按钮,表单不会立即卸载。

在Process按钮中,我编写了如下代码:

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

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

在Cancel按钮中,我编写了以下代码

代码语言:javascript
复制
Unload me

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

需要VB 6代码帮助

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-12 14:30:35

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

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

您可以通过如下操作建立这样的连接:

代码语言:javascript
复制
Private WithEvents m_conn As ADODB.Connection
...
Set m_conn = New ADODB.Connection
Call m_conn.Open(connectionString, , , adAsyncConnect)

像这样执行一个查询/存储过程--这里你会注意到的主要区别是,代码不会挂起直到查询完成,而是像往常一样继续执行):

代码语言:javascript
复制
sql = "SELECT Col1 FROM etc. etc."
Call m_conn.Execute(sql, , adAsyncExecute)

取消正在运行的查询,如下所示:

代码语言:javascript
复制
Call m_conn.cancel

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

代码语言:javascript
复制
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 -尽管看起来是一个笨拙的机制,但它确实工作得很好。在整个过程中使用其中的一些,你应该会注意到一些改善。尽管可能不完美,但它可能已经足够好了。

例如:

代码语言:javascript
复制
retrieve results
...
DoEvents
...
build temporary tables
...
DoEvents

每次命中一个DoEvents块时,如果用户单击Cancel按钮,则应触发该代码。

注意:当代码仍在运行时,你可能还想对卸载表单保持一点警惕,我不相信一切都会正确卸载。在这种情况下,您可能希望拥有以下内容:

代码语言:javascript
复制
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
票数 8
EN

Stack Overflow用户

发布于 2009-08-12 11:28:47

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

一样

票数 4
EN

Stack Overflow用户

发布于 2012-10-12 03:31:51

简而言之,编写更多的DoEvents in Process按钮的代码。

或者使用DoEvents的替代代码,它比DoEvents更好、更快。http://nirsoft.net/vb/doevents.html

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1264513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档