关于vb6:如何立即退出程序? |
您所在的位置:网站首页 › vb退出应用程序的代码 › 关于vb6:如何立即退出程序? |
使用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 |