关于vb6:如何立即退出程序?

您所在的位置:网站首页 vb退出应用程序的代码 关于vb6:如何立即退出程序?

关于vb6:如何立即退出程序?

2023-06-13 15:37| 来源: 网络整理| 查看: 265

使用VB 6和Access 2003

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

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

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

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

在VB代码处理数据库时,是否有任何方法可以立即退出程序(例如,创建记录集,创建临时表)?

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

1Unload me

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

需要VB 6代码帮助

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

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

您可以通过以下方式建立这样的连接:

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

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

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

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

1Call m_conn.cancel

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

123Private 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-尽管看似笨拙的机制,但它确实起作用很不错。在整个过程中撒一些,您应该注意到一些改善。尽管可能还不够完美,但可能已经足够了。

例如

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

每当用户单击一个DoEvents块时,如果用户单击"取消"按钮,则代码将触发。

注意:您可能还需要对在代码仍在运行时卸载表单有所警惕,但我不认为一切都会正确卸载。在这种情况下,您可能想要类似以下内容:

1234567891011121314151617Private 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

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

VB6的经典技巧是使用DoEvents-在此处查看更多信息。 或者,您可以在后台线程中运行处理。像MSDN文章所述,也许通过Interop使用.NET BackgroundWorker组件。编辑这是行不通的! 编辑:或通过委派到任务完成时回叫的ActiveX exe。像这样。

尝试:

1End 相关讨论 可能无济于事,听起来像是"处理"被阻止,并且Click事件没有触发,直到处理完成。 简单规则:切勿在VB6中使用End。它会杀死您的程序,而不会使其有机会正常退出。 它适用于我的应用程序 由于这些答案中有许多好的解决方案,因此实际上是only答案,实际上"答案"了原始问题。

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

相关讨论 该答案如何扩展到3年前发布并接受的其他答案(都已建议DoEvents)? 这是替代代码,效果更好。不相信吗?尝试;) 更好吗?它的作用与Sleep(0)的真实DoEvents()条几乎完全相同。请尝试备份您的声明并提供证据和参考,而不仅仅是发布并说"这更好",尤其是当链接页面没有说出更好(甚至有一定限制)时。 我不知道你在说什么,但是我尝试了这段代码,并且效果更好,因为DoEvents有时会挂起应用程序,但是这段代码可以正常工作... DoEvents本身不会挂起应用程序,因为它所做的只是一个消息泵,而让Windows做它的事情。 这段代码对我有帮助,我认为它也可以对他有所帮助:)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3