トップページ > プログラム > 2014年04月14日 > 7M5WCkF4

書き込み順位&時間帯一覧

6 位/201 ID中時間01234567891011121314151617181920212223Total
書き込み数0001000000000110020000005



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
41
ふらっとVisual C#,C♯,C#(初心者用) Part111

書き込みレス一覧

ふらっと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
むしろ、スレッド実行中にフォームを閉じさせない、
あるいはフォームのデコンストラクタでスレッド実行を停止するのが正しい方向性なのかな?


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。