这个问题太奇怪了。我提交它是希望有人可能以前见过它并知道修复。
环境VB6,SQL 2005,Citrix XenApp 6.5。仅当从Citrix客户端运行时才会出现此问题。
背景信息:
Main .bas模块加载,在Main子系统中,它使用ADO记录集来调用SQL server(2005)来加载数据。从控制台运行时,应用程序会在1或2秒内加载并显示。从Citrix客户端调用时,它会减慢至少30倍。但是,如果我们放置一个MsgBox
即
MsgBox“测试消息......”
在Main子代码中,它加载1到2秒,就像来自控制台的负载一样。必须在加载充当应用程序视觉背景的MDI表单后放置MsgBox。如果在加载MDI之前放置,则无法解决问题。
通过将调试消息放在MDI表单的标题中,我们检测到遍历记录集所花费的时间是所有时间都在其中的位置。
问题是MsgBox语句如何影响记录集的访问速度。听起来很奇怪,但是使用MsgBox声明:快速,没有它:致命的慢。
Sub Main的简化版本如下,神奇的MsgBox表示。
****************************************************************
*
****************************************************************
Sub Main()
On Error GoTo errHandler
'CSR 527
If Not ReadIniFiles Then
MsgBox "Error reading ini files...contact systems.", vbExclamation
End
End If
g_SecurityInClause = "YES"
If Not SetSecurity Then
MsgBox "Unable to acquire your authorization credentials. Exiting..."
Exit Sub
End If
Set cn = New Connection
With cn
' .ConnectionTimeout = 30
.ConnectionString = CONNECTION_STRING
.Open 'Options:=adAsyncConnect
End With
App.HelpFile = App.path & "\xx.chm"
g_bExiting = False
frmMain.MousePointer = vbHourglass
DoEvents
frmMain.Show
MsgBox "test" <== PLACING THIS MSGBOX HERE SPEEDS UP APP BY A FACTOR OF AT LEAST 30
IF IT IS ABOVE frmMain.Show IT HAS NO EFFECT
'assign connection string and record source to ado controls
'PLOG 74
Load frmA
frmA.Adodc1.ConnectionString = CONNECTION_STRING
frmA.Adodc2.ConnectionString = CONNECTION_STRING
frmA.Adodc3.ConnectionString = CONNECTION_STRING
'timeouts for Phoenix
frmA.Adodc1.CommandTimeout = 300
frmA.Adodc2.CommandTimeout = 500
frmA.Adodc3.CommandTimeout = 500
frmA.Adodc1.RecordSource = "select some stuff"
frmA.Adodc2.RecordSource = "select some stuff"
frmA.Adodc3.RecordSource = "select some stuff"
frmA.Adodc1.Refresh
frmA.Adodc2.Refresh
frmA.Adodc3.Refresh
LoadMinorCodes
DetermineDeleteAccess
LoadStates
frmMain.MousePointer = vbNormal
frmStartBoard.Show
Exit Sub
errHandler:
MsgBox Err.Number & " " & Err.Description & " Main"
End Sub
答案 0 :(得分:0)
从jac的评论,添加DoEvents,以及它为你工作的事实,它一定只是一个竞争条件问题。它可能在显示表单之前等待数据库连接。添加doEvents改变了那个顺序。