- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MFC 6.0 VC++ で、処理が重くなります。)
MFC 6.0 VC++で処理が重くなる原因と対策
このQ&Aのポイント
- MFC 6.0 VC++で処理が重くなる問題について説明します。
- 処理が重くなる原因として、画面の再描画と描画処理に必要な計算が挙げられます。
- また、仮想ウィンドウに描画してBitBlt()を実行する方法も試しましたが、処理が重くなってしまいました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
使用したスレッドやクラス、メモリの開放は行われていますか? タスクマネージャーは「コミットチャージ」ではなく「プロセス」で、 該当アプリの「メモリ使用量」「ハンドルの数」「スレッドの数」も確認してください。
その他の回答 (1)
- koi1234
- ベストアンサー率53% (1866/3459)
回答No.2
計算内容にもよりますが計算してからOnPaint行うのが一般的な考え方ではないでしょうか 時間経つごとに計算量が増えるようなロジックであれば 当然遅くなるということはありえると思います ちょっと気になりましたが 処理が重いというのはOS全体のレスポンスが悪くなる ということでしょうか それともアプリケーションの表示(更新・その他)が遅くなるということでしょうか? >タスクマネージャーを見るとコミットチャージが増えているようです。 #1さん書かれてますがどこかでリークしてるような気がします アプリケーション終了時にVC上に一杯エラー表示されませんか?
質問者
お礼
解決しました。 ありがとうございます。 エラーは表示されていませんでしたが、表示部でリージョンを2重に定義している部分がありました。 重複している部分を削除したら、現象が収まりました。
質問者
補足
ありがとうございます。 計算というより、計算結果をforループなので座標を出しながら表示していくもので、時間と共に内容が変わるものではありません。 ちゃんと測定したわけではありませんが、重くなっているのはアプリケーションのみだと思います。 特にエラーは表示されません。重くなっているのを我慢すれば使用し続けられます。
お礼
解決しました。 メモリーが増えている部分を追跡したところ・・・ Rgn.CreateRectRgn(SelScreen.left,SelScreen.top,SelScreen.right,SelScreen.bottom); が2行重複して定義されている部分がありました。 これを削除したところ、現象を回避することができました。 どうやら、私のポカミスだったようです。 ありがとうございました。
補足
ありがとうございます。 ダイアログの初期化の際に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(); } ・・・っといった構成になっています。