|
分類:[C#]
分類:[C#]
初めまして。 少し質問させてください。
現在、C#でListView(Detail)を用いてファイルの内容を表示させるアプリを開発しているのですが ファイルの容量が大容量になると、固まってしまいます。 仮想ListViewで実装することも考えたのですが、大容量のファイル読み込み時には仮想ListViewでも重くなることは重くなるようですし 何より仮想ListViewでは列毎のソートが出来ないらしいので、仮想ListViewを使うわけにはいきません。 # 列毎のソートは今回のアプリの必須機能
そこで、マルチスレッドプログラミングを用いて、ファイルの読み込みを別スレッドにすることを考えたのですが それがどうも上手くいきません。
開発環境はVS2005で、ソースコードはこんな感じです。
<summary> 引数として渡されたファイル名で示されるファイルを解析します。 </summary> <param name="fileName">ファイル名(絶対パス指定)</param> private void logRead(string fileName) { if (!System.IO.File.Exists(fileName)) { MessageBox.Show("ファイルがありません。"); } else { logListView.Items.Clear(); // ファイルからログを読み出す。 try { using (StreamReader r = new StreamReader(fileName, Encoding.Default)) { string line; // 10はListViewのカラム数 string[] logListData = new string[10];
while ((line = r.ReadLine()) != null) { logListData[0] = line.Substring(0, 8); int startPoint = 8; int endPoint = 0; ListViewItem subItems = new ListViewItem(); // 空白文字を区切りとして(読み込むファイルは空白文字が区切りとなっている)ログを読み出し、配列に格納する。 for (int i = 1; i < logListData.Length - 1; i++) { endPoint = line.IndexOf(" ", startPoint); logListData[i] = line.Substring(startPoint, endPoint - startPoint); startPoint = endPoint + 1; } logListData[9] = line.Substring(startPoint); // ListViewに取得した項目を追加する。 for (int i = 0; i < logListData.Length; i++) { if (0 == i) { // テキスト色設定 switch (logListData[0]) { case "ERROR ": subItems.BackColor = Color.LightPink; break; case "WARNING ": subItems.BackColor = Color.LightGreen; break; case "INFO ": break; case "DEBUG ": break; default: logListView.Items.Clear(); MessageBox.Show("ファイル形式が間違っています。正しいファイルを開いてください。"); return; } subItems.SubItems[0].Text = logListData[0]; } else { subItems.SubItems.Add(logListData[i]); } } logListView.Items.Add(subItems); } } } catch (Exception ex) { logListView.Items.Clear(); MessageBox.Show(ex.ToString()); } } }
この部分を別スレッドにすればListViewが固まることはないのではないかと思うのですが やり方が今ひとつわかりません。 delegateとinvokeを使うようなのですが・・・。 ご教授よろしくお願いします。
|