C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 51 を表示中)
■27702 / )  Re[10]: C#タイマーでのpictureBox.Image更新nitu
□投稿者/ フミ (6回)-(2008/11/12(Wed) 16:59:14)
最初の質問(■No27520)のプログラムの修正

以下のようにプログラムを修正しましたら、
タイマーで無謀なサイズ・無謀な時間で画像更新を行っても、
エラー(>System.InvalidOperationException: オブジェクトは現在他の場所で使用されています。)
はでなくなりました。
timerはwindows.forms.timerだとフォーム自体を動かせなくなってしまったので、
やはり最初と同じsystem.timers.timerを使いました。
またイベントに再入してもよいように防御しました。
(interLockを用いました。たぶんこれで大丈夫?なのか???)
しかし、タイマーをストップするときやフォームを×印で閉じると
以下のエラーがでます。。。

「破棄されたオブジェクトにアクセスできません。
 オブジェクト名 'Form1' です。」

タイマーを破棄したときに
イベントが無視されsetPicture()を実行しないようにしないとまずそうです。。。

???ここのコメントに書くとプログラムのTabが消滅してみにくくなってしまいますね。。。
???どうにかなるのでしょうか??

以下修正版プログラム

using System;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
//画面表示用デリゲート
private delegate void SetImageCallback(Bitmap inBmp);

//画面更新用タイマー
private System.Timers.Timer timeTimer;

//再入防御用フラグ
private int syncPoint = 0;

//メインフォーム
public Form1()
{
//コンポーネントの初期化
InitializeComponent();

//タイマーの生成
timeTimer = new System.Timers.Timer(10);
timeTimer.Elapsed += new System.Timers.ElapsedEventHandler(timeTimer_Elapsed);
timeTimer.Enabled = true;
}

//タイマーのイベント
void timeTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//再入の防止
if (Interlocked.CompareExchange(ref syncPoint, 1, 0) == 0)
{
//絵の更新
setPicture();
syncPoint = 0;
}
else
{
//何もしない
}

}

//絵の更新用メソッド
private void setPicture()
{
SetBmp(Properties.Resources.aaaaa);//絵1
SetBmp(Properties.Resources.bbbbb);//絵2
}

//画面表示用デリゲート
private void SetBmp(Bitmap inBmp)
{
if (this.pictureBox1.InvokeRequired)
{
SetImageCallback d = new SetImageCallback(SetBmp);
this.Invoke(d, new object[] { inBmp });
}
else
{
this.pictureBox1.Image = inBmp;
}
}
}
}

返信 編集キー/


管理者用

- Child Tree -