C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]


(過去ログ 112 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■66497 / inTopicNo.1)  RetrieveVirtualItemの発生タイミング
  
□投稿者/ ランラン (1回)-(2013/04/29(Mon) 16:51:14)

分類:[C#] 

2013/04/29(Mon) 17:02:29 編集(投稿者)
2013/04/29(Mon) 17:02:21 編集(投稿者)

お世話になります。ランランと申します。
C#で仮想リストビューを使用してファイルの一覧を表示しています。
リストビューは詳細表示にしています。

描画処理が遅いことがあり、RetrieveVirtualItemイベントが発生したタイミングで
発生したことをトレース出力してみたのですが、1つのListViewItemに対して、複数回の
描画が走っていることがわかりました。

※最後の数値は関数の引数をもとにしたアイテムインデックス(e.ItemIndex)です。

16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
lvFile_DrawSubItem
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:595 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
lvFile_DrawSubItem
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:610 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:626 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:626 FNC : lvFile1_RetrieveVirtualItem 0
lvFile_DrawSubItem
16:38:56:626 FNC : lvFile1_RetrieveVirtualItem 0
16:38:56:626 FNC : lvFile1_RetrieveVirtualItem 0

上記のように、1個のファイルに対して、27回もイベントが発生しています。
※lvFile_DrawSubItemはListViewのDrawSubItemイベントに登録している
 サブアイテム表示用処理です。

複数のファイルがあると、上記のセットが表示するアイテム(ファイル)分繰り返されていきます。
RetrieveVirtualItem は1個のアイテムに対して1回起きればいいように思いますが、なぜ
このようなことが起こるのでしょうか?

.NET2010 C# win7

よろしくお願いしますm(__)m
引用返信 編集キー/
■66524 / inTopicNo.2)  Re[1]: RetrieveVirtualItemの発生タイミング
□投稿者/ shu (297回)-(2013/05/01(Wed) 17:44:24)
No66497 (ランラン さん) に返信

ログ結果だけでなく書かれたソースを載せた方がよいかと思います。
引用返信 編集キー/
■66527 / inTopicNo.3)  Re[1]
□投稿者/ Azulean (152回)-(2013/05/01(Wed) 20:14:50)
2013/05/01(Wed) 20:23:53 編集(投稿者)

shu さんが言われているようにソースコードを提示することによって、無駄が生じている原因がコードにあるのかどうかは推測できるかもしれません。

No66497 (ランラン さん) に返信
> RetrieveVirtualItem は1個のアイテムに対して1回起きればいいように思いますが、なぜ
> このようなことが起こるのでしょうか?

これを正確に答えられる人はいないと考えてもらった方がよいです。
理由は、一番の根底では Windows のコモンコントロールの実装に依存しますが、その内情を知る人はごくわずかだからです。
経験談から知っている情報を提供してもらえる可能性はあるかもしれませんが…。
(再描画やリサイズ、アイテムのサイズ計算のたびにリクエストが来ているような気もしますが、きちんと見極めはしていません。RetrieveVirtualItem で毎度重たい処理をしているのであれば、高頻度で来るイベントと受け入れて生成結果をキャッシュするなど工夫が必要だとは思います)

シンボルを使ってデバッガで見るとか、逆アセンブルすればある程度推測できるかもしれません。しかし、これらの行為は、使用許諾が禁じる部分に当たるかどうか怪しい話なので、仮に知っていたとしてもオープンな場で言う人はいないんじゃないかなとも思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -