[トピック内 7 記事 (1 - 7 表示)] << 0 >>
度々お世話になってます。 早速、質問させていただきます。 メインのスレッドで複数個のBitmap生成し、あるタイミングでDraw系のメソッドで描画処理を行っています。 それと同時に別スレッドでも、メインのスレッドに対し「書き込みせよ」のイベントを発生させ描画の処理をさせているのですが -------------------------------------------- オブジェクトは現在他の場所で使用されています ヒント:GetHDC メソッドの後にグラフィックスオブジェクトを使用する場合、ReleaseHdcメソッドを呼び出してください。 -------------------------------------------- と怒られてしまいます。 はじめは -------------------------------------- lock (g) ← は Graphics.FromImage(Bitmap) より取得した Graphics オブジェクト { g.DrawString("xxxx"); } --------------------------------------- で駄目だったので、次は static 変数で現在処理中を判断するための bool Drawing の変数を用意し 以下のようにしてみました。 --------------------------------------- while (obj.Drawing) { System.Threading.Thread.Sleep(100); } // drawが終了するまでループ obj.Drawing = true; try { lock (g) { g.DrawString("xxxx"); } } finally { obj.Drawing = false; } ---------------------------------------- やっぱり駄目でした。orz lock の使用方法(考え方)が間違っているのでしょうか? Bitmap複数個使用しているのが問題なんでしょうかねぇ・・ エラーになる時とならない時があるので解決できず困っています。 よろしくお願いします。
C# の lock ステートメントはクリティカルセクションです。 たぶん、 lock(g) とやったときに、g 自身がロックされると勘違いされているのではないでしょうか? class Clazz{ private static object syncobj = new object(); public void Func1(){ lock(syncobj){ // コード1 } } public void Func2(){ lock(syncobj){ // コード2 } } } lock は上記のようにやれば、「コード1」を実行中に「コード2」が実行される事はありません、という使い方です。 当然ですけど、まったく同じオブジェクトをロックしなければなりませんよ。
管理者用
- Child Tree -