4

4 つの PictureBox コントロールを持つ Winform があり、各コントロールには異なる画像が含まれます。プロセスは次のとおりです。

イベント x が発生し、このイベントからの eventargs には、各画像のファイル名 (4) が含まれます (ファイルが存在するなど)。次に、UI を更新する必要があります。

一般的に私は呼び出しを使用します:

Invoke((ThreadStart)delegate()
{
    picBig.Image = new Bitmap(strImageBig);
    picLittle1.Image = new Bitmap(saLittle[0]);
    picLittle2.Image = new Bitmap(saLittle[1]);
    picLittle3.Image = new Bitmap(saLittle[2]);
});

// saLittle[] is a string array, contains, filenames: "image1.jpg"

しかし、これが実行されると、フォームは約 500 ミリ秒の間フリーズします。短い間隔であることはわかっていますが、目立ちます。その後、アプリは正常に続行されます。

その「UI フリーズ」の理由を突き止めようとしていたところ、調査の結果、BeginInvoke が見つかりました。今私のコードは次のようになります:

BeginInvoke((MethodInvoker)delegate
{
    picBig.Image = new Bitmap(strImageBig);
    picLittle1.Image = new Bitmap(saLittle[0]);
    picLittle2.Image = new Bitmap(saLittle[1]);
    picLittle3.Image = new Bitmap(saLittle[2]);
});

これは少し速いです。しかし、UI はまだ 200 ~ 300 ミリ秒フリーズしています。

私が読んだ記事では、BeginInvoke は Invoke よりも優れた方法であると書かれています。

コードは問題なく動作しています。ロジックなどに問題はありません。なぜこれが起こるのか知りたいだけです。この疑問を曖昧にしたくありません。プロジェクトはすでに終了しています。これが他の誰かに役立つことを願っています。

たぶん、これは正しいアプローチではありません。バックグラウンド スレッドから UI を更新する方法はたくさんありますが、更新を高速化する別の方法はありますか?

それとも、画像の読み込みが原因だと思いますか? 画像の読み込みを高速化する別の方法はありますか?

前もって感謝します。

4

2 に答える 2

4

これは、コントロールの内容を設定するとともに、UI スレッドで実際にディスクから画像を読み込んでいるためです。ファイル パスを指定してコンストラクターを呼び出すBitmapと、ハード ドライブに移動し、イメージがメモリに読み込まれます。

Invokeコントロールが作成されたスレッド (UI スレッドである可能性が最も高い) で、指定したデリゲートをBeginInvoke実行します。

...しかし、更新をより速くする別の方法はありますか?

バックグラウンド スレッドに画像を読み込み、実際に読み込まれたら、画像を呼び出してコントロールに設定します。

                    var big = new Bitmap(strImageBig);
                    var little1 = new Bitmap(saLittle[0]);
                    var little2 = new Bitmap(saLittle[1]);
                    var little3 = new Bitmap(saLittle[2]);

                    Invoke((ThreadStart)delegate()
                    {
                        picBig.Image = big;
                        picLittle1.Image = little1;
                        picLittle2.Image = little2;
                        picLittle3.Image = little3;
                    });                    
于 2012-06-08T23:00:25.563 に答える
0

しかし、これが実行されると、フォームは約 500 ミリ秒の間フリーズします。短い間隔であることはわかっていますが、目立ちます。その後、アプリは正常に続行されます。

最終的に、UI スレッドは実際に画像を更新する必要があります。UI スレッドで画像が生成および更新されると、(短い) 遅延が発生します。

于 2012-06-08T22:22:30.213 に答える