3

この問題は奇妙なものではありません。誰かが以前にそれを見て、修正を知っているかもしれないことを願って、私はそれを提出しています.

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

コンテキスト:

メイン .bas モジュールが読み込まれ、メイン サブモジュールで ADO レコードセットを使用して SQL サーバー (2005) が呼び出され、データが読み込まれます。コンソールから実行すると、アプリは 1 ~ 2 秒で読み込まれて表示されます。Citrix クライアントから呼び出すと、少なくとも 30 倍遅くなります。ただし、MsgBox を配置すると、

すなわち

MsgBox "テスト メッセージ..."

Main サブのコードでは、コンソールからのロードと同じように 1 ~ 2 秒でロードされます。MsgBox は、アプリの視覚的な背景として機能する MDI フォームを読み込んだ後に配置する必要があります。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
4

1 に答える 1

0

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

于 2013-08-02T13:08:53.240 に答える