ウインドハンドルとデバイスコンテキストについて – 固定ページ 2 – プログラミング – Home

ウインドハンドルとデバイスコンテキスト...
 
通知
すべてクリア

[解決済] ウインドハンドルとデバイスコンテキストについて

固定ページ 2 / 3

仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

だめですか(vv;)。

では、ペンをWM_PAINT内で、CratePen() DeleteObject()するのをやめて、
WM_CREATEでペンの作成をし、WM_DESTROYで、ペンをDeleteObject()
する様に変更してみてはどうでしょう。
ペンのハンドルは、各メッセージ処理の関数から参照できる場所に
なければなりません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

ん?
特定のPCでメモリーオーバー?
ならば、特定のPCと他のPCの違いを調べてみる必要があるのでは?
又は、表示する画像の容量が大きいということはないですか?


返信引用
vivace98
 vivace98
(@vivace98)
ゲスト
結合: 13年前
投稿: 15
Topic starter  

仲澤@失業者やITOさんありがとうございます

ペンハンドル関係の解放処理を再確認してみます。

windows7に変更したことによるAPIの違いでエラーになるかもしれません


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

途中から描画できないとあるが「途中」とはどのくらい?
また、仲澤さんの指摘された部分を修正後
その「途中」に変化はありましたか?

>WM_PAINTは透明ウインドウ描画時のみ使用し、
>ペンによる描画はWM_MOUSEMOVEメッセージにより行っています。
描画タイミングが2個ありますが
そのどちらも反映されなくなりますか?


返信引用
daigo
 daigo
(@daigo)
ゲスト
結合: 13年前
投稿: 3
 

>描画ウインドウは常に最前面に表示するようにしています
って他のウィンドウが新しく最前面で立ち上がればこのウィンドウより上に来ると思いま
すが・・・。
それでも大丈夫なのかな?

どのようなソフトかは詳しく分からないけどそれなりの描画ソフトっぽいし自分なら
WM_MOUSEMOVE内で hMemDCに書いてInvalidateRectとUpdateWindowで描画を促して
WM_PAINT内でhMemDCをhDCにコピーして描画する・・・かな。

>描画を行う度にCreatePenとDeleteObjectを繰り返すひつようはありますか?
仲澤@失業者 さんが言われているけど、
同じペンを使い続けるなら最初に作って最後に削除するだけでいいと思います。

普通のウィンドウにWM_MOUSEMOVE内で線を引くのを繰り返すという単純なプログラムでも
なるのでしょうか?

正直、ペンのくだりではなく全然違う部分が原因って事もありえるのかも・・・。


返信引用
vivace98
 vivace98
(@vivace98)
ゲスト
結合: 13年前
投稿: 15
Topic starter  

ryoさんありがとうございます

ウインドウに文字を200文字程度書くと固まります

ほかに修正後も効果はありませんでした


返信引用
vivace98
 vivace98
(@vivace98)
ゲスト
結合: 13年前
投稿: 15
Topic starter  

daigo さんありがとうございます

daigo さんのアドバイスを参考にさせていただきながら
他の原因も考えています


返信引用
kinoko
 kinoko
(@kinoko)
ゲスト
結合: 13年前
投稿: 4
 

GDIリソースをリークするプログラムを作ってwinxp/vista/7上で動かして
途中から描画が出来なくなる症状を確認してみました。

描画が出来なくなる症状が発生すると、xpではウィンドウのキャプションも再描画
されなくなります。

また、ARさんが紹介している[タスクマネージャ]-[プロセスタブ]-[表示(V)]-
[列の選択(S)...]-[GDIオブジェクト]をチェックする方法で確認したところ、
vista/7ともにGDIオブジェクトが10,000になると描画停止が起こりました。

メモリの食いつぶしは見られないとのことですが、vivace98さんのプログラムでは
GDIオブジェクトの数値はいくつくらいになっていますか?


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

>ウインドウに文字を200文字程度書くと固まります
固まる・・というのはハングアップ状態?
最初は、プログラムは動き続けていて描画だけされないとの話でしたが・・・

しかし、200文字程度というのはよくわからないです

200文字を表示するのに、一回で表示してるのか
一文字ずつ200回表示作業が行われているのか?
その作業はどのような手順が行われいてるのか?
わかりません

WM_PAINTがどのくらい呼ばれているのか(たとえば秒間n回で、何分間以上とか)
マウスによる作業をどのくらいやったのか
そういう感じで情報お願いします

♯Penの使い方のところでバグがあったみたいだし
♯その他の部分も出せるならソースを出してみるのもいいかも

>>WM_PAINTは透明ウインドウ描画時のみ使用し、
>>ペンによる描画はWM_MOUSEMOVEメッセージにより行っています。
>描画タイミングが2個ありますが
>そのどちらも反映されなくなりますか?
この質問についてはどうでしょうか?

あと実験ですが、
描画が反映されなくなった状態で、
そのウィンドウを最小化し、その後サイズ復帰をしてみたらどうなりますか?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> ウインドウに文字を200文字程度書くと固まります
ん?200文字?
FONTのGDIオブジェクト使ってないですか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

他のPCでは動いているというのがかなり気になりますね。
環境依存があるのかもとか。
単純に考えてグラフィクドライバ周りは大丈夫なのかなぁとか
考えてしまいますけれど。

あと、他のPCで動いている事がプログラムに問題が無い証明には
ならないのでその点は頭に置いておいた方が良いかなと思います。
メモリを壊している系の不具合だとこっちのPCでは動くのに
あっちのPCでは動かないなんて事も普通にありえるので。


返信引用
vivace98
 vivace98
(@vivace98)
ゲスト
結合: 13年前
投稿: 15
Topic starter  

kinoko さん
ありがとうございます

GDIオブジェクトの参照方法を間違えていました

描画不可能時にはGDIオブジェクトは10000になっていました


返信引用
vivace98
 vivace98
(@vivace98)
ゲスト
結合: 13年前
投稿: 15
Topic starter  

ITO さん
ありがとうございます

背景に円周率を表示しており
200ケタ程度数字をなぞるとかたまります


返信引用
vivace98
 vivace98
(@vivace98)
ゲスト
結合: 13年前
投稿: 15
Topic starter  

PATIO さん
ありがとうございます

GDIオブジェクトを確認しながら
メモリエラーをつぶしていきます


返信引用
kinoko
 kinoko
(@kinoko)
ゲスト
結合: 13年前
投稿: 4
 

となるとGDIリソースの復元・解放・削除もれの可能性が高いかもしれません。
線の描画以外に、文字列の描画もされているようなので、

・線の描画に関連する部分のみコメントアウト
・文字描画に関連する部分のみコメントアウト

をそれぞれ実行してみて、GDIオブジェクトの数値や描画の停止が起こるかを確認し、
GDIリソースのリーク箇所を探してみてください。
HFONTを生成・使用している場合は、その部分もGDIの処理になります。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました