MFC 6.0 VC++ で、処理が重くなります。
上記の環境でダイアログベースで処理を作成しています。
画面の再描画を繰り返すと、同じ処理をしていても処理が重くなります。
OnPainメッセージを受け取ったあとに、描画処理を行っているのですが、画面に表示に必要な計算も描画時に行っています。
仮想ウィンドウに描画してBitBlt()を実行する方法も試しましたが、ちらつかなくなった代わりに余計に処理が重くなりました。
描画のやり方が問題なのか、内部の処理が問題なのか良く分からないのですが、何か良い方法が無いでしょうか?
タスクマネージャーを見るとコミットチャージが増えているようです。
このコミットチャージもどう対処してよいのか良く分からないのですが、これが関係しているでしょうか?
No.1ベストアンサー
- 回答日時:
使用したスレッドやクラス、メモリの開放は行われていますか?
タスクマネージャーは「コミットチャージ」ではなく「プロセス」で、
該当アプリの「メモリ使用量」「ハンドルの数」「スレッドの数」も確認してください。
この回答への補足
ありがとうございます。
ダイアログの初期化の際にInitDialogからcallocを使用して確保したメモリはOnDestroy内で開放していますが、この部分ではない気がします。
確認してみたところ、ハンドル数とスレッド数は変化ありませんが、メモリー使用量が増えています。
再描画するたびに増えているので、描画関連の処理の中で何かが起きている気がします。
描画は描画用のクラスを作成して、内部にCDC m_dcを設けて、m_dc.Attach(*dc)の後に描画処理をおこない、終了後にm_dc.Detach()を実行しています。
BOOL CGraphics::MyCreate(CDC *dc)
{
BOOL flg = m_dc.Attach(*dc);
m_dc.SetBkMode(TRANSPARENT);
return flg;
}
HDC CGraphics::MyDetach()
{
return m_dc.Detach();
}
///////////////////////////////////////////////////////////////////////////////////
// 線を引く
///////////////////////////////////////////////////////////////////////////////////
void CGraphics::line(int x1, int y1, int x2, int y2, int width, COLORREF color)
{
CPen pen;
pen.CreatePen(PS_SOLID,width,color);
m_dc.SelectObject(&pen);
m_dc.MoveTo(x1,y1);
m_dc.LineTo(x2,y2);
pen.DeleteObject();
}
・・・というような基本構成になっています。
呼び出す側は・・・
ヘッダーの中で CGraphic m_Gr;をダイアログのメンバシップ変数として定義しています。
void CMyDialog::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
MyViewMain(&dc);
}
// 描画のメイン
void CMyDialog::MyViewMain(CDC *dc)
{
ViewGrid(dc,View.GridLink[START],0);
ViewGrid(dc,View.GridLink[END],1);
dc->SelectClipRgn(NULL);
}
void CMyDialog::ViewGrid(CDC *dc, int grid, int sid)
{
CRgn Rgn;
m_Gr.MyCreate(dc);
Rgn.CreateRectRgn(SelScreen.left,SelScreen.top,SelScreen.right,SelScreen.bottom);
m_Gr.m_dc.SelectClipRgn(&Rgn);
//このあたりにforループなどで制御された描画命令が書かれる
Rgn.DeleteObject();
m_Gr.MyDetach();
}
・・・っといった構成になっています。
解決しました。
メモリーが増えている部分を追跡したところ・・・
Rgn.CreateRectRgn(SelScreen.left,SelScreen.top,SelScreen.right,SelScreen.bottom);
が2行重複して定義されている部分がありました。
これを削除したところ、現象を回避することができました。
どうやら、私のポカミスだったようです。
ありがとうございました。
No.2
- 回答日時:
計算内容にもよりますが計算してからOnPaint行うのが一般的な考え方ではないでしょうか
時間経つごとに計算量が増えるようなロジックであれば
当然遅くなるということはありえると思います
ちょっと気になりましたが
処理が重いというのはOS全体のレスポンスが悪くなる ということでしょうか
それともアプリケーションの表示(更新・その他)が遅くなるということでしょうか?
>タスクマネージャーを見るとコミットチャージが増えているようです。
#1さん書かれてますがどこかでリークしてるような気がします
アプリケーション終了時にVC上に一杯エラー表示されませんか?
この回答への補足
ありがとうございます。
計算というより、計算結果をforループなので座標を出しながら表示していくもので、時間と共に内容が変わるものではありません。
ちゃんと測定したわけではありませんが、重くなっているのはアプリケーションのみだと思います。
特にエラーは表示されません。重くなっているのを我慢すれば使用し続けられます。
解決しました。
ありがとうございます。
エラーは表示されていませんでしたが、表示部でリージョンを2重に定義している部分がありました。
重複している部分を削除したら、現象が収まりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
ブレゼンハムのアルゴリズムに...
-
panelのスクロール表示について
-
描画を透明にする方法
-
Form1 Load で実行されない。
-
VBAにGDI+を参照させる方法
-
タスクバーを再描画
-
OSX 仮想カメラ 作り方
-
画像の印刷について
-
VB.netでのライン描画方法がわ...
-
NVIDIAのシェーダーキャッシュ
-
GetGlyphOutline() ご利用経験...
-
VB6,リストボックスの特定行の...
-
エクセルでガンチャートを作成...
-
word
-
pset関数について
-
Delphiでキューを作りたい
-
マインクラフト(pc版)で座標...
-
エクセルで作った新しいウイン...
-
コントロールの書式設定で、“コ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
word
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
Minecraft 統合版(PC)の描画距...
-
google Colabでmatplotlibの描...
-
TextBoxに文字を書いても表示さ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
OneNote 2010 文字と描画がずれる
-
Labelの文字をスクロールする際...
-
InvalidateRectの使い方について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
VC++プログラムをつかったBMP画...
-
WM_SIZEとWM_SIZINGの違い (Win...
-
エクセルでガンチャートを作成...
-
c言語を使いダイアログにbmpを...
-
WM_PAINT
-
MFCのタイマーのつかい方を教え...
おすすめ情報