|
最初の質問(■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; } } } }
|