2

ループ内で文字列処理を実行し(約500回)、テキストボックスに情報を追加するVB6プログラムがあります。ループの各反復には、Trim、Len、Left、Midなどの基本的な操作が含まれ、最後に文字列をテキストボックスに追加します(この時点ではフォーム全体はまだ表示されていません)。最後に、ループの後、コードはフォームでShowを呼び出します。

Windows XPでは、これらの500ループには約4秒かかります。Windows 7では、まったく同じコードが約90秒で実行されます。

これを修正する方法について何か提案はありますか?

ありがとう。

4

3 に答える 3

4

ループの反復ごとにテキストボックスを追加すると思います...可能であれば、すべてを変数に格納しTextBox、ループの終了後に1回追加します。VB6では、テキストボックスにテキストを表示するのに時間がかかります。

編集:さらに調査とテストを行った結果、コントロールの長さが最大になると、文字列をTextプロパティに直接割り当てるパフォーマンスが大幅に低下するという結論に達しました。私のPCの最大値は、 MSDNTextBoxよると、何らかの理由で65535です。

Windows NT 4.0、Windows 2000、Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server、Windows XP Home Edition、Windows XP Professional x64 Edition、Windows Server 2003プラットフォーム注:単一行テキストボックスコントロールの場合、MaxLengthプロパティが設定されている場合0まで、ユーザーが入力できる最大文字数は2147483646、または使用可能なメモリに基づく量のいずれか小さい方です。

基本的に、何が起こっているように見えますか。TextBox各反復にテキストを追加し続けると、最大に達するまでそれほど遅くはありません。さらに不可解なことに、最大値を超えてテキストを追加しようとすると、エラーは発生しませんが、パフォーマンスは大幅に低下します。

私のテストループでは、0から12773になります。これは次のとおりです。

Text2.Text = Text2.Text + CStr(a) + " "

したがって、ループが4秒で完了すると、Text2.Textは65534文字の長さになります。ここで、ループを2倍にして最大許容長を超えると、TextBox完了するまでに3倍の時間がかかります。

12773-4秒

12773*2-16秒

これに気付いた後、私の最初の考えは、をに置き換えることでしTextBoxRichTextBox。しかし、後者のパフォーマンスはさらに悪くなります。これは、反復ごとに更新することを前提としています。

あなたはジレンマに悩まされているようです-ループが完了した後に一度だけパフォーマンスが遅くなるか、テキストボックスを更新するようにコードを変更します。さらに、TextBoxの最大長の制限により、RichTextBoxまたはこの目的に応じて、または他のオブジェクトに切り替えることをお勧めします。

私の発見がお役に立てば幸いです。これらの小さなプログラミングの癖をすべて見つけるのは確かに楽しかったです。

于 2012-09-25T20:30:05.510 に答える
2

LockWindowUpdateを試して、フォームの更新をオフにしてください。

 Declare Function LockWindowUpdate Lib "user32" (ByVal hWnd As Long) As Long 

'To turn it on just call it like this, passing it the hWnd of the window to lock. 
LockWindowUpdate Form1.hWnd

'intensive updating here

 'to turn it off just call it and pass it a zero.
 LockWindowUpdate 0

ここから

于 2012-09-25T18:09:45.740 に答える
0

何が遅いのかを正確に知ることをお勧めします。文字列の連結の前後、および文字列をテキストボックスにコピーする前後にタイミングをやり直します。Ole Automationの文字列操作がどういうわけか遅くなったのですか、それともVBテキストボックスへのテキストのコピーが遅くなったのですか?

これを知ったら、フェーズ2を続行できます... :-)

于 2012-09-26T09:10:18.430 に答える