- - PR -
イベントが頻発するようなWindowsアプリケーションの挙動について
«前のページへ
1|2|3|4
| 投稿者 | 投稿内容 | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-08-22 10:14
レスが遅くなりまして申し訳ありません。
渋木宏明(ひどり)さん:
為替や株価のような「リアルタイムでデータ更新を反映」させるのが重要なシステムを ご想像頂ければと思います。データ更新の待ち時間は極力少なくしたいと考えています。
この方法も試させて頂こうと思います。 なちゃさん:
仰っているのはマルチスレッド化したケースのことですよね? 現状では何の変哲も無い イベント処理ですのでBeginInvoke()、EndInvoke()などはコールしておりません。 この辺に関して知見が無いので間違っていたらご指摘下さい。
現状ではこうした統計情報は取っていない状況です。サーバーは現在も本番用が 稼動しており、そこから更新データを受け取っているので、とりあえずこの状況下で .NETクライアントが満足な動作をするか確認している、といった感じです。
Paintイベントに関しては現状では手を付けておりませんが、将来的にはデータが 更新されたときに一瞬背景色を変更する、といった加工をするかもしれません。
データセットの更新対象のローやカラムにデータを追加しているだけなので、 「更新が必要な一部のデータだけ計算して、画面全体を再描画」に当たるかと 思います。 ほげたさん:
恥ずかしながらBeginLoadData()やInvokeRequiredというキーワードは未知でした。 これから確認します。 Jittaさん:
現状ではこのレベルの検証までに至っておりません。というか顧客側から こうした検証はまだ求められていない状況です。前述のように本番データ の負荷に耐えうるか?という観点で作業を進めているところです。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2005-08-22 11:04
既に指摘されていることですが、そこら辺の判断には各種の数値が必要です。 雰囲気的には、自前で描画してしまった方がよさそうに思います。 あるいは、大した行数でなければリストビューを使うのでもいいかもしれません。
「イベント処理だから InvokeXXX が不要」な保証はどこにもありません。
それじゃ意味ないですよ。 実装によって方法でいくらでもパフォーマンスなんか変わります。 だからこそ、数値が必要なんです。 ボトルネックがどこにあるかもつかまずに想像だけで作業したって、意味ある前進は得られないです。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||||||||||||||||||||||||||
|
投稿日時: 2005-08-22 11:16
という前提のようですが、そもそも1000行のデータを画面に表示できるの? なんて、疑問があるのですが... それは置いておいたとして、重要なシステムであればデータの取りこぼしが一番致命的に 思います。 以下の手順ではいかがでしょうか? 1)イベントの処理はキューイングして画面描画は別スレッドで行う。 2)ある程度キュー内のデータが増えてきたときは画面再描画をとめて処理する。 3)2)の処理がある一定時間(1秒とか)以上かかる場合でも定期的に再描画する。 キューに充分な大きさが割り当てられていれば、再描画をとめるまでも無いと 思いますが、キューやWindowsのメッセージキューあふれによってデータ処理が 滞ってしまうよりは、はるかにましだと思います。 人間の認知速度には限界があると思いますので画面更新頻度は1回/秒程度あれば、 充分リアルタイムとみなされると思います。 動体視力のテストゲームでもやられるつもりなのでしょうか? また、垂直同期以上の速さで画面更新はされませんよ^^; | ||||||||||||||||||||||||||||||||
|
投稿日時: 2005-08-22 11:31
これは数値の如何によって推奨される既知の実装やコントロールがある (もしくは自作する?)という意味でしょうか? Web上にその辺りに関する資料があるようでしたらご教授下さい。
先の投稿で「現状では何の変哲も無いイベント処理」と書きましたが、これは 「マルチスレッド化していないイベント処理」ということでした。この場合でも InvokeXXXが必要となるケースがある、ということでしょうか? | ||||||||||||||||||||||||||||||||
|
投稿日時: 2005-08-22 12:10
>たとえば、最後に描画した時刻を記憶しておいて、5秒以上経過しないうちは
>再描画しないとか。 上、自分の発言の引用ですが、兎に角こういう事をやってみてはどうですか。 DataGridが無ければ問題は発生しないんですよね? なら早いところ限界を計測して おかないと、求める性能が不定のままです。 実際のところ、1秒に10回受信したとき0.1秒で描画、とか普通無理なのでその辺は 諦めてはどうですか。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2005-08-22 13:00
そういうことです。 求められている性能に対して、それを実現するための相応の設計があるはずです。
知りません。 工学的な見地から当たり前のことだと思います。 1の量を扱うものと、10000からの量を扱うものが、まったく同じでいいはずはありません。 (思想的な共通性ではなく、物理的な構成に関してです)
「マルチスレッド化していないイベント処理」の意味がよく分かりません。 通信用の DLL が内部でスレッドを使用していない保証があり、かつまたそれを扱うスレッドと UI を駆動するスレッドが同一の場合、InvokeXXX は不要です。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2005-08-23 02:20
その数値をちゃんと計測すれば、アプリケーション全体でパフォーマンスが出ないと嘆かずに 同程度の更新負荷をかけるような簡単な検証プログラムを作成して DataGrid自体の性能に限界があるのか、使い方がまずいだけなのか 他のコンポーネントでは耐えられるのか、自前で描画すれば追いつくのか すぐにわかると思います。 今のアプリケーションでパフォーマンスが出ないからといって 自前で苦労して作っても、単にマーシャリングしていないだけだったら意味ないですし だいたいのオーダーだけでも計測して、目標値を決めたほうがいいですよ。 | ||||||||||||||||||||||||||||||||
|
投稿日時: 2005-08-23 04:59
気になっているのですが、DataGrid の再描画を、どの様に行おうとしているのでしょう?
例えば、DataGrid.DataSource に設定するデータを再作成しているのであれば、それってとても時間が無駄ですよね? そうではなく、DataSource のスポットデータを更新しても、描画が追いつかないのでしょうか? 渋木宏明(ひどり)さんが、『リストビューアイテムの再充填はやっちゃ駄目です。』と指摘されていることですが、DataGrid でも同じように言えます。 > 前述のように本番データ > の負荷に耐えうるか?という観点で作業を進めているところです。 えっと・・・顧客から具体的な検証を求められていなくても、現状レベルの要求はされることが予想されるのですよね?だから、現在の本番データ負荷に耐えらるか、検証しなければならないわけですよね? であるなら、現在の本番データの数値をもらってくる必要があると思うのです。そうでないと、「耐えうるか」の判断が出来ないと思うのですが、いかがでしょう? _________________ | ||||||||||||||||||||||||||||||||
«前のページへ
1|2|3|4
