2012-04-04 14 views
3

この問題は奇妙です。私は誰かが以前にそれを見て、修正を知っているという希望でそれを提出しています。VB 6データアクセスはMsgBoxの影響を受けます

環境VB6、SQL 2005、Citrix XenApp 6.5。この動作は、Citrixクライアントから実行している場合にのみ表示されます。

文脈:

メイン.BASモジュール負荷とメインサブでは、データをロードするためにADOレコードセットを使用して、SQLサーバー(2005)を呼び出します。コンソールから実行すると、アプリは1〜2秒で読み込んで表示します。 Citrixクライアントから呼び出された場合、我々はすなわち

のMsgBoxのMsgBox

を配置する場合、それはのコードで

「テストメッセージ...」、しかし少なくとも30倍遅くなりますMainサブの場合、コンソールからのロードと同様に1〜2秒でロードされます。 MsgBoxは、アプリケーションの視覚的な背景として機能するMDIフォームを読み込んだ後に配置する必要があります。 MDIが読み込まれる前に配置されていても、問題は解決されません。 MDIフォームのキャプションにデバッグメッセージを配置することにより

が、我々はそれがレコードセットをすべての時間がに追加されている場合を歩くのにかかる時間を検出した。

の質問はどのようにすることができますのMsgBoxステートメントがありますレコードセットのアクセス速度に影響します。非常に奇妙に聞こえるが、MsgBoxステートメントでは:高速、それなし:致命的に遅い。

縮小版のSub Mainは、下に示したMsgBoxの魔法の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 
+3

テストmsgboxをDoEventsに置き換えると、同じ結果が得られますか? – jac

+0

ADODC(ADO Data Control)を使用してデータにアクセスするのはなぜですか?フォームやコントロールを使用せずにどこからでもADODBでデータにアクセスできます。 – Martin

+0

'Load frmA'の後にMsgBoxを動かすとどうなりますか? – tcarvin

答えて

0

jacのコメントから、DoEventsを追加するには、それがあなたのために働いたという事実から、競合状態の問題であったに違いありません。それはおそらくデータベースがフォームを示す前に接続するのを待っていたでしょう。 doEventsを追加すると、その順序が変更されました。

関連する問題