現在、FileViewer コントロールを作成しようとしています。アイテム (アイコン付きのファイル名、サイズなど) を ListView (アイコン - ファイル名 - 拡張子 - サイズ) に追加した後、ファイルが画像かどうかも確認します (png /jpg など) ですが、これは別のスレッドで行います。
スレッドに対する私の期待は、メイン アプリケーションの横で実行されることですが、すべてのファイルを追加した後で、このスレッドを開始します。ListView 内のすべてのファイルをチェックし、それらのサムネイルを作成します。正しく行われた場合、ListView アイコンは読み込まれると 1 つずつ表示されるはずですが、そうではありません。それらはすべて同時に表示されます。
...スレッドがアクティブな間は何もできません。
なぜこれが起こっているのですか?以前にスレッドを扱ったことがありますが、常に機能していました。コールバックでメソッドを呼び出します。
スレッドの流れ:
- フォーマット ファイル キー = "C:\image.png" = "C_image_png"。
- 画像へのサムネイルが存在するかどうかを確認し(キーを確認して)、それを使用します
- それ以外の場合は、Image.FromFile().GetThumbnailImage() でサムネイルを読み込み、Listview の画像に Key で画像を追加します。
- 最後に、ListView アイテムの ImageKey を変更します。
すべてスレッドで行われます。
private void GetFiles()
{
// Load all files in directory
Thread t = new Thread(new ThreadStart(GetImageFiles));
t.Priority = ThreadPriority.Lowest;
t.Start();
}
delegate void GetImageFilesCallback();
private void GetImageFiles()
{
if (this.IsHandleCreated)
{
if (files.InvokeRequired)
{
GetImageFilesCallback callback = new GetImageFilesCallback(GetImageFiles);
this.Invoke(callback);
}
else
{
string extension = "";
string key = "";
foreach (string file in _files)
{
extension = FileManager.GetExtension(file);
key = (DirectoryCurrent + file).Replace(":", "").Replace("\\", "_").Replace(".", "_");
foreach (string knownimages in _knownImageTypes)
{
if (extension.ToLower() == knownimages)
{
foreach (ListViewItem item in files.Items)
{
if (item.Text == file)
{
if (files.SmallImageList != null)
{
if (files.SmallImageList.Images[key] == null)
{
files.SmallImageList.Images.Add(key, Image.FromFile(DirectoryCurrent + file).GetThumbnailImage(16, 16, null, IntPtr.Zero));
files.LargeImageList.Images.Add(key, Image.FromFile(DirectoryCurrent + file).GetThumbnailImage(32, 32, null, IntPtr.Zero));
}
files.Items[item.Index].ImageKey = key;
}
}
}
}
}
}
files.Refresh();
}
}
}