
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- デスクトップパソコン 仕事で使うPC 10 2023/04/23 00:27
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- アニメ 過去の質問から要約するとアニメの映像が眩しくまた、色んな質感が画面いっぱいに加えられてるのは 予算の 1 2023/08/23 01:09
- UNIX・Linux Linux Ubuntu22.4の起動時エラーについて 2 2022/07/22 14:52
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- 画像編集・動画編集・音楽編集 動画編集の処理時間と編集後の動画容量について 2 2022/12/29 21:27
- 美術・アート 絵が描きたいのに、描けないときの対処法 高校1年生です。 数ヶ月前から、大好きだった絵がうまくかけな 5 2022/11/14 16:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TextBoxに文字を書いても表示さ...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
InvalidateRectの使い方について
-
クライアント領域を再描画させ...
-
VC++を使ってCで記述しグラフを...
-
google Colabでmatplotlibの描...
-
VC++プログラムをつかったBMP画...
-
OpenCV処理画像をpictureBoxへ。
-
DXライブラリについて(ゲーム...
-
Delphiでキューを作りたい
-
C#のタブコントロールについて...
-
panelのスクロール表示について
-
VB.netでのライン描画方法がわ...
-
StretchBlt関数について
-
CStaticコントロールの静的イメ...
-
円の描画の太さを指定できるCコ...
-
GDI+のDrawStringを使って文字...
-
WM_PAINTとBitBlt
-
CScrollViewの使用方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報