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

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

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

Re[2]: 描画時のAccessViolationについて


(過去ログ 72 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■42454 / inTopicNo.1)  描画時のAccessViolationについて
  
□投稿者/ 26% (1回)-(2009/10/15(Thu) 21:51:01)

分類:[.NET 全般] 

初投稿ですが質問させてください。

今作っているアプリで次のような問題を抱えています。

【環境】
 WindowsXP Embededd SP2
 .net Framework2.0

【問題】
 Formデザイナに設定した背景イメージを描画しようとするとAccessViolationでアプリが落ちる。
 この描画はOnPaintBackgroundでの描画になります。
 同じタイミングであれば手動でCreateGraphicsからグラフィクスオブジェクトをつくって描画しても同様の症状になります。


この問題に対してある程度解析すると次のようなことが分かってきました。

・描画処理とほぼ同じタイミングでガベージコレクションが動作する。

恐らくこのタイミングでガベージコレクションのスレッドもGDI+オブジェクトにアクセスしており、
AccessViolationが発生したのだと予想しています。


そこで質問なのですが、

1.GDI+へのアクセス競合以外に描画処理でAccessViolationが発生する可能性があるかどうか?
2.ガベージコレクションを.net Framework2.0で一時的にでも抑制する方法があるかどうか?


本来であれば全てのGDI+に絡むオブジェクトをGCで回収されないようにするのが筋だとは分かっているのですが、
なにぶん量が多いので一時しのぎでも確実に回避できる策を模索しています。
引用返信 編集キー/
■42455 / inTopicNo.2)  Re[1]: 描画時のAccessViolationについて
□投稿者/ Azulean (469回)-(2009/10/15(Thu) 22:37:39)
No42454 (26% さん) に返信
> 恐らくこのタイミングでガベージコレクションのスレッドもGDI+オブジェクトにアクセスしており、
> AccessViolationが発生したのだと予想しています。
特殊なことをしていない限り、使用中のオブジェクトが GC によって勝手に解放されることは考えにくいのですが…。

# 例えば、GDI+ のオブジェクトをファイナライザで解放するコードでも書いているのでしょうか?
引用返信 編集キー/
■42462 / inTopicNo.3)  Re[2]: 描画時のAccessViolationについて
□投稿者/ 26% (2回)-(2009/10/15(Thu) 23:53:55)
2009/10/15(Thu) 23:59:09 編集(投稿者)

Azuleanさん、返信ありがとうございます。

> 特殊なことをしていない限り、使用中のオブジェクトが GC によって勝手に解放されることは考えにくいのですが…。
>
> # 例えば、GDI+ のオブジェクトをファイナライザで解放するコードでも書いているのでしょうか?


ファイナライザでGDI+のオブジェクトに触ってないことはすでに確認済みです。
「~」の文字で全検索をかけたので間違いないかなと。
問題と予想しているのはメンバ変数、ローカル変数として持っていたGDI+オブジェクトが
ファイナライザ経由でdisposeを呼び出していることだと思っています。

使用中のオブジェクト、ではなくて使用済みのGDI+にアクセスすることと、
実際にGDI+をつかって描画することがクロススレッドしてるのかなぁと。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -