- ふらっとVisual C#,C♯,C#(初心者用) Part111
41 :デフォルトの名無しさん[sage]:2014/04/14(月) 03:59:00.92 ID:7M5WCkF4 - 練習として複数のPictureBoxに、高速で複数の画像を入れ替えまくってみたんですが
private void button1_Click(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(loop)); t.Start(); } void loop(){ for (int i = 0; i < 1000; i++) { pictureBox1.Image = mybmp[i % 3]; pictureBox2.Image = mybmp[(i + 1) % 3]; pictureBox3.Image = mybmp[(i + 2) % 3]; Thread.Sleep(50); } } ときどき下のようなエラーが出ます。 これは、単純にPictureBoxの描画処理が終わらないまま次の描画を始めようとしたためでしょうか? 同一スレッド内の問題だからか、PictureBoxをlockしてみても改善しません。 実際この通りの動作をさせるわけではないですが、高速で画像を更新することはあると思うのでこのままだと気持ち悪い・・・。 >型 'System.InvalidOperationException' のハンドルされていない例外が System.Drawing.dll で発生しました >追加情報:オブジェクトは現在他の場所で使用されています。
|
- ふらっとVisual C#,C♯,C#(初心者用) Part111
45 :41[sage]:2014/04/14(月) 13:39:40.86 ID:7M5WCkF4 - ありがとう、デリゲートとinvokeってここで使うのか。
ついでに、サンプルプログラムを見ているとthisが何を指しているかよくわからないことがあるんだけど thisが何を指すか調べる方法ってあります?
|
- ふらっとVisual C#,C♯,C#(初心者用) Part111
49 :デフォルトの名無しさん[sage]:2014/04/14(月) 14:32:41.71 ID:7M5WCkF4 - えーと、thisについてよくわからないのは・・・
例えば>>47のInvokeってthisが省略されてますよね? この場合、thisはFormを指してるのでいいのかな・・・というのを確認する方法ってあるかなと。 慣れると自明に思えるのかもしれませんが、まだ戸惑うことが多いので確認方法があるとうれしいのです。
|
- ふらっとVisual C#,C♯,C#(初心者用) Part111
53 :41[sage]:2014/04/14(月) 17:31:10.51 ID:7M5WCkF4 - ありがとう、重ねて質問失礼します。
Invokeを利用することでエラーは回避できました。 ですが、スレッド実行中にフォームを閉じるとエラーが起こるようになりました。 this.IsHandleCreatedやthis.IsDisposedでフォームの存在を確かめてからInvokeを実行させようとしてみたのですがうまくいきません。 どのように回避したらいいのでしょうか。 下は、>>41のloop()内にInvokeを反映させたものです。 ループ実行中にフォームを閉じると、 >追加情報:破棄されたオブジェクトにアクセスできません。 のエラーが出ます。 for (int i = 0; i < 1000; i++) { if(this.IsDisposed)break; this.Invoke((MethodInvoker)delegate() { pictureBox1.Image = mybmp[i % 3]; pictureBox2.Image = mybmp[(i + 1) % 3]; pictureBox3.Image = mybmp[(i + 2) % 3]; }); Thread.Sleep(50); }
|
- ふらっとVisual C#,C♯,C#(初心者用) Part111
54 :41[sage]:2014/04/14(月) 17:40:58.42 ID:7M5WCkF4 - むしろ、スレッド実行中にフォームを閉じさせない、
あるいはフォームのデコンストラクタでスレッド実行を停止するのが正しい方向性なのかな?
|