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

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

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

Re[2]: Tailを作ろうとすると悩む所(画面描画)


(過去ログ 126 を表示中)

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

■74925 / inTopicNo.1)  Tailを作ろうとすると悩む所(画面描画)
  
□投稿者/ ザザ (3回)-(2015/02/09(Mon) 23:53:37)

分類:[.NET 全般] 

いつもお世話になってます。

開発をしているとログを見ることが多々あると思うのですが、どうにもWindows系でこれだ、というのが見つからず・・・国産、海外含め10数種類、片っ端から試してみましたが、なかなか自分の求めているものが見つかりません。
単に1ファイルの監視で良ければまだ良いのですが、複数ファイルを同時に閲覧となってくると、局面によってこう表示して欲しい、など細かい注文が出てしまいます。
SourceForgeで LogExpertというものも知って、ソースからカスタマイズした事もありましたが、、やはり細かい所になると思うとおりにならずでして;;

そういった中、Hoo WinTail が自分の理想に近く、シェアウェア購入をしまして、Shift-JISベースのログはもうこれで満足しています。
が、今度はこのソフトの不満点として、UTF-8(日本語)のログを閲覧しようとすると各文字が半分ずつしか描画されません。開発元にUnicode版で日本語のUTF-8のログを表示するとこうなるのだけどと、画面キャプチャや再現用のサンプルログ等を送って解析を依頼するも、問題があることは認識し、検討します、と返事をいただきましたが、一向にアップデートの気配がありません。

もういっそ、自分で一から作ってしまおうかと、(周期的に)思い立つのですが、tailソフトの開発の設計段階で頭を悩ませるのが「描画」方法をどうするか、という点です。

tail ですから、例えば FileSystemWatcherでファイルの更新監視、
ReadOnly、他プロセスオープン可でログファイルを開き、前回との差分を読み込んでバッファリング、
バッファサイズを超えたら領域解放、その領域に新データ分を読み込んでサイクリックに・・・と、
データ管理のロジックは大体できているのですが、その「バッファしている領域」を「どうやって画面に反映するか」という点がひっかかります。

更新がある都度、バッファの内容をTextBox、またはRichTextに丸ごと設定しなおせば楽ではありますが、チラチラして読みにくいですし、ファイルの更新頻度が高ければCPU負荷もばかにならないと思います。
またAppendしていくだけでは、これはこれでメモリを食いますし、いつか行数の上限に達するであろうと思います。(少なくともスクロールが現実的でなくなっていくと思います)

バッファを超えて追加する分量に見合う分を先頭からカットするのが現在の所有力候補かなと考えつつ検討していますが、例えば描画中の文字列配列を直接コントロールしたり、Canvasに直接描いて自前でスクロース制御をしたりするというのも手としてあるのだろうか、と思った次第です。(直接描画は、Hoo WinTailが文字の「半分だけ」描画しているのはそういう方法を使っているからなのかな、との想像から来てます。ただ、描画してしまうと、今度は文字列選択ができいないという欠点が・・・)

何か効率の良さそうな描画方法について、アドバイス等ございましたら、是非教えてください。
宜しくお願いします。

引用返信 編集キー/
■74933 / inTopicNo.2)  Re[1]: Tailを作ろうとすると悩む所(画面描画)
□投稿者/ キム (48回)-(2015/02/10(Tue) 13:08:45)
No74925 (ザザ さん) に返信

> 何か効率の良さそうな描画方法について、アドバイス等ございましたら、是非教えてください。

仮想リストビュー(ListViewコントロールの仮想モード)はいかがでしょう?
自前で管理している大量のデータがあって、UI制御だけ高速に行いたいということであれば、
仮想リストビューが適していると思います。
引用返信 編集キー/
■74936 / inTopicNo.3)  Re[2]: Tailを作ろうとすると悩む所(画面描画)
□投稿者/ ザザ (4回)-(2015/02/10(Tue) 21:45:51)
No74933 (キム さん) に返信

> 仮想リストビュー(ListViewコントロールの仮想モード)はいかがでしょう?
> 自前で管理している大量のデータがあって、UI制御だけ高速に行いたいということであれば、
> 仮想リストビューが適していると思います。

ありがとうございます! まさに、こういう機能が欲しかったです。
まさか標準で用意されていたとは・・・
VirtualModeというプロパティがあるのですね。
これを手がかりに、今度は LogExpertのソースをGrepしたら、見事にヒットし、DataGridViewの VirtualModeを使っていることが判りました。
ListView、DataGridViewなどの VirtualModeを活用することを検討してみたいと思います。

ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -