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

わんくま同盟

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

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


(過去ログ 51 を表示中)
■27790 / )  Re[12]: C#タイマーでのpictureBox.Image更新nitu
□投稿者/ フミ (8回)-(2008/11/14(Fri) 15:41:48)
No27721(Jitta様)へ返信

絵の更新部分setPicture()に関しては
もともとpictureBoxに絵を代入するあたりで、
エラー(>System.InvalidOperationException: オブジェクトは現在他の場所で使用されています。)
をだしていて、そこをエラーがでないようにするよう変更したかったので、
そのエラーがでやすいように下のように2つ連続で書きました。
なので実際には

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

とひとつで行う予定です。

ちなみに上掲のプログラムにて2つの絵を10msで連続更新すると
更新自体は全く追いつかず、絵がチラチラしつつ描き変わる部分と描き変わらない部分が混ざりながら更新します。
ただ上記のエラーはでないです。
タイマーのスピードを調整すれば画面の更新はうまくいきます。

あと
■No27702で言った、
フォームを閉じたときのエラー
「破棄されたオブジェクトにアクセスできません。
 オブジェクト名 'Form1' です。」
ですが、
たぶんタイマーのイベント中にフォームが閉じられpictureBoxが破棄されてしまうために
出てくると思うのですが、
フラグ等を立てて防ごうとしましたが、
何ともなりませんでした。
しかたないので、
pictureBoxにイメージを代入するデリゲート内にtry-catchを追加して、
握りつぶすことにしました。。。。。
もっとちゃんとした解決法があればいいのですが。。。

こうしたらエラーなく画面更新がうまくいくようになったので、
あとはタイマーのスピードを調整すれば問題なさそうです。

とりあえず、まだもやもや部分が残っていますが解決ということに。。。
本当はこのtry-catch部分も改善したいですが。
何か情報あればお教え下さい。

ちなみに以下のようにデリゲート部分を変更しました。

        //画面表示用デリゲート
        private void SetBmp(Bitmap inBmp)
        {
            try
            {
                if (this.pictureBox1.InvokeRequired)
                {
                    SetImageCallback d = new SetImageCallback(SetBmp);
                    this.Invoke(d, new object[] { inBmp });
                }
                else
                {
                    this.pictureBox1.Image = inBmp;
                }
            }
            catch
            {
                //フォーム破棄時にObjectDisposedExceptionが出る可能性があるが、
                //対策が見つからないのでcatchでエラーを握りつぶす。。。。
            }
        }


解決済み
返信 編集キー/


管理者用

- Child Tree -