VisualBasic6.0SP6(以下VB6SP6)にて、

MSFlexGridを使用していますが、表示データを
更新する方法を教えて下さい。

Winsockでデータを受信して、受信データを
MSFlexGridコントロールの各セルへ設定しますが、
即座に表示が更新されない場合があります。

・更新はされますが、数秒間、表示が切り替わらない場合があります。
・MSFlexGridコントロールの各セルへデータを設定した後に、
 「Form1.MSFlexGrid1.Refresh」を実行しましたが、
 変化ありません。
・MSFlexGridコントロールの各セルへデータを設定した後に、
 「Form1.Refresh」を実行しましたが、
 変化ありません。

他に手順があるようなら、
ご教授願います。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/05/27 02:13:04
  • 終了:2008/05/28 17:49:02

回答(2件)

id:freemann No.1

freemann回答回数308ベストアンサー獲得回数502008/05/27 03:34:14

ポイント20pt

VB6.0はずいぶん前にやったため記憶で回答します。

外れていたらポイントはいらないです。

どれぐらいのデータ量を一度に表示しようとしているのかわかりませんが、かなりの量を表示しようとすると表示が追い付かなくなります。これはWindowsでは、メッセージの待ち行列に表示の更新指示があっても、その表示に絡む処理があるとそちらの処理を優先します。つまり表示は後回しです。

なぜなら、処理によって結果が変わると表示も変わる可能性が高いためにこのようになっているようです。

また、表示すること自体が比較的重い処理のはずなので、セルにひとつデータを入れるごとに表示処理を強制的にさせていると処理が重くなる可能性があります。

ですので、表示の更新はグリッドにすべてのデータを入れた後にやるとレスポンスが良くなると思います。

ただどうしても途中で即座に表示の更新をしたい場合には、現在Refreshを入れているところにDoEventsを入れてみてください。

DoEventsはそこの関数での処理をいったん止めて他の処理(この場合は表示)をしてくれます。

DoEventsのサンプル

id:futurista

回答有難うございました。

表示処理全て(関数)を終了した箇所で、DoEventsを実施。

→変化なし。

表示処理の中(関数内のループの中)にDoEventsを実施。

→表示が(セルのひとつひとつ)切り替わりは速くなった。

 しかし、画面全体の表示更新そのものが遅れる現象は残っている。

(7~8秒遅れる。)

受信→表示処理は、DataArrivalイベントの中で、一貫して実施して

いるのですが、受信部分で時間を浪費しているかと思い、時間を

計測しましたが、100ms未満でした。

2008/05/27 09:06:19
id:freemann No.2

freemann回答回数308ベストアンサー獲得回数502008/05/28 11:37:28

ポイント50pt

そうでした!

Redrawをfalseにすると早くなります。ただ希望するほどまで早くなるかはわかりませんが。

以下のHPを見てみてください。

Redrawをfalseに

id:futurista

回答有難うございました。

Win2000で問題なく、XPで遅くなるところが、こちらの条件と同じでしたので、

改善されるかと思いましたが、、、若干やや遅いところがありました。

(前よりは、速くなっているようですが。)

2008/05/28 17:48:17

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません