5

C# Visual Studio 2010で、数秒後に画像を 1 つずつ表示する画像ビューアーを作成したいと考えています。

i = 0;

if (image1.Length > 0) //image1 is an array string containing the images directory
{
    while (i < image1.Length)
    {
        pictureBox1.Image = System.Drawing.Image.FromFile(image1[i]);
        i++;
        System.Threading.Thread.Sleep(2000);
    }

プログラムが起動すると停止し、最初と最後の画像だけが表示されます。

4

4 に答える 4

16

Thread.Sleep は、代わりにSystem.Windows.Forms.Timerを使用する UI スレッドをブロックします。

于 2012-08-20T14:38:23.137 に答える
13

タイマーを使用します。

最初にタイマーを宣言し、毎秒ティックするように設定し、ティックしTimerEventProcessorたときに呼び出します。

static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Interval = 1000;
myTimer.Start();

クラスにはimageCounter、TimerEventProcessor関数にアクセス可能な現在の画像を追跡するために、image1配列とint変数が必要です。

var image1[] = ...;
var imageCounter = 0;

次に、各ティックで何をしたいのかを書きます

private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs) {
    if (image1 == null || imageCounter >= image1.Length)
        return;

    pictureBox1.Image = Image.FromFile(image1[imageCounter++]);
}

このようなものが機能するはずです。

于 2012-08-20T14:49:45.140 に答える
0

はい、Thread.Sleep2 秒間は UI スレッドをブロックするためです。

代わりにタイマーを使用してください。

于 2012-08-20T14:38:45.280 に答える
-1

Timerイベント ハンドラーの使用と定義を避けたい場合は、次のようにします。

DateTime t = DateTime.Now;
while (i < image1.Length) {
    DateTime now = DateTime.Now;
    if ((now - t).TotalSeconds >= 2) {
        pictureBox1.Image = Image.FromFile(image1[i]);
        i++;
        t = now;
    }
    Application.DoEvents();
}
于 2014-04-13T19:43:28.640 に答える