2

コンバーターの処理中に GIF 画像を表示したい。しかし、GIF 画像にはディスプレイが表示されず、コンバーター プロセスは約 20 秒で正常に完了するため、画像ボックスは空白になります。コンバータ プロセスを MessageBox.Show に置き換えると、Gif 画像と Message.Show の両方が正常に動作します。

私は何をする必要がありますか?

Thread th = new Thread((ThreadStart)delegate                  
{
    pictureBox1.Image = Image.FromFile("loading_gangnam.gif");                                 
    Thread.Sleep(5000);
});

th.Start(); 

//MessageBox.Show("This is main program");
Converted = converter.Convert(input.FullName, output);
4

4 に答える 4

3

UI の描画は、ペイント イベント中に行われます。ペイント イベントは、コードが考えていることをすべて終了したときにのみ処理されます。

さらに、現在のコードは壊れています。ワーカー スレッドからUI コントロール ( など) を操作しないでください。PictureBoxこれにより、「クロススレッド操作が検出されました」(または同様の) 例外が発生します。

オプション:

  • 画像の一部を処理してからペイントし、タイマーまたはその他のイベントをスケジュールして、描画を一時的に続行します
  • 分離された(非 UI) イメージのバックグラウンド スレッドで作業を行い、現在の作業イメージのコピーを定期的に作成し、コピーをピクチャ ボックスのコンテンツpictureBox1.Invoke(...)に設定するために使用します。

イベントを UI ループで処理できるようにする明示的な方法もありますが、これは非常に悪い習慣であり、名前で言及することさえできません。

于 2012-12-19T07:09:25.303 に答える
1

メイン UI スレッドとは異なるスレッドからフォーム コントロールにアクセスしています。Invoke() を使用する必要があります。

例については、こちらを参照してください

于 2012-12-19T07:08:29.650 に答える
1

スレッドが逆になっています。UI スレッドで GIF をすぐに表示する必要がありますが、変換は新しいスレッドで実行されます。次のようになります。

Thread th = new Thread((ThreadStart)delegate                  
{
    Converted = converter.Convert(input.FullName, output);
});
th.Start(); 

// should probably check pictureBox1.InvokeRequired for thread safety
pictureBox1.Image = Image.FromFile("loading_gangnam.gif");   

さらに読む: http://msdn.microsoft.com/en-us/library/3s8xdz5c.aspx http://msdn.microsoft.com/en-us/library/ms171728.aspx

于 2012-12-19T07:17:34.887 に答える
0

この関数を試して、loading_gangnam.gif 画像を設定してください:

public void newPicture(String pictureLocation)
{
    if (InvokeRequired)
    {
        this.Invoke(new Action<String>(newPicture), new object[] { pictureLocation });
    }
    pictureBox1.Image = Image.FromFile(pictureLocation);
    pictureBox1.Refresh();
}

私が取り組んでいるプロジェクトには、すべて同じフォームにアクセスする複数のスレッドがあり、これは私にとってはうまくいきます!

于 2012-12-19T08:13:11.110 に答える