
現在、VC++2010 MFCでアプリケーションを作成しています。
処理している内容は、ADボードから電圧値をもらい、それをエディットボックスに表示する処理ですが、タスクマネージャなどでみるとGDIオブジェクトが増加していき、9999になるとアプリケーションがフリーズしてしまいます。調べたところ、解放するプログラムが必要みたいですが、解放方法が分かりませんでしたので質問させていただきました。最初にエディットボックスのレイアウトを変更する処理をしています。
以下が今回のプログラムとなっております。
CFont* m_pFont;
CFont* m_pFont;m_pFont = new CFont;
m_pFont->CreatePointFont(200,"");
((CEdit *)GetDlgItem(IDC_EDIT1))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT2))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT3))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT4))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT5))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT6))->SetFont(m_pFont);
DeleteObject(m_pFont);
SetTimer(1,1000,NULL);
以下が毎秒処理となっております。
void Power_Noise::OnTimer(UINT_PTR nIDEvent)
{
m_nRet = m_pADControl->AD_In_Out(m_AD1,m_AD2,m_AD3,m_AD4,m_AD5,m_AD6);
if(m_nRet == FALSE){
MessageBox("失敗");
KillTimer(1);
}
UpdateData(TRUE);
m_xvEditVolt[0] = m_AD1;
m_xvEditVolt[1] = m_AD2;
m_xvEditVolt[2] = m_AD3;
m_xvEditVolt[3] = m_AD4;
m_xvEditVolt[4] = m_AD5;
m_xvEditVolt[5] = m_AD6;
UpdateData(FALSE);
}
No.4ベストアンサー
- 回答日時:
フォントの生成(CreatePointFont() や CreateFont() 等の呼び出し)を OnInitDialog() 以外の場所で行っていないでしょうか。
もし OnInitDialog() だけでしか行っていないのであれば、GDIオブジェクトのリークはフォント以外の別の要因があるように思います。(それとも、プログラム起動中に何度もダイアログの生成と破棄を繰り返すような作りになっていたり…は、さすがにしないですよね)OnTimer() の処理は質問で提示されたもののみですか?
また、何らかの描画処理を OnPaint() などで自前で行っていたりしないでしょうか?
オーナードローを行っていたり、どこかで GetDC() を呼ぶ処理が入っていたりなどしないかについても確認してみてください。
回答ありがとうございます。
よく調べていくと、 描画処理の所にブラシの生成を行っていたのが原因でした。
本当にありがとうございます。
No.2
- 回答日時:
>その後、ボタンやエディットなど各種フォントを設定しているんですが、その際、大きさ(ポイント)などを変更するために、m_pFont->CreatePointFont()を何回か実行しています。
char *a = malloc(100);
で確保して、
a = malloc(200);
とすると、最初のmalloc()で確保されたメモリはどうなるでしょうか?
まあ、CFont::CreatePointFont()でよろしく処理してくれている可能性はあるかも知れませんが。
# それでも…使用中のものだと……。
一度別のCFontインスタンスを作成して、そっちでCreatePointFont()。
新しく作成してCFontでSetFont()して、元のGDIオブジェクトを使用中の状態から未使用の状態にして解放。
その後で一時的に作成したCFontをm_pFontにコピーする…とかでしょうかねぇ。
# ポインタらしいのでちょいと違うか…。
>m_pFont->CreatePointFont(200,"");
>((CButton *)GetDlgItem(ID_BTN_START ))->SetFont(m_pFont);
>((CButton *)GetDlgItem(ID_BTN_STOP ))->SetFont(m_pFont);
> :
>m_pFont->CreatePointFont(140,"");
>((CEdit *)GetDlgItem(IDC_EDIT1))->SetFont(m_pFont);
>((CEdit *)GetDlgItem(IDC_EDIT2))->SetFont(m_pFont);
> :
こういうことしたいのならば、使い回しではなく別々に用意するべきかと…。
この回答への補足
一応、一つずつフォントを宣言しました。
たぶんこれで、きちんとすべて解放されてると思います。
後は、エディットに毎秒値を表示すると、GDIオブジェクトが増え続ける問題が発生しています。
No.1
- 回答日時:
>((CEdit *)GetDlgItem(IDC_EDIT6))->SetFont(m_pFont);
>DeleteObject(m_pFont);
使用中のGDIオブジェクトは解放できません。
というか、上記のコードはドコにあるんです?
>CFont* m_pFont;
>CFont* m_pFont;m_pFont = new CFont;
m_pFontは複数あるんですか?
クラスのメンバとしてCFontを追加、コンストラクタ辺りでフォントを作成して、OnInitDialog()でフォントを設定。
デストラクタで解放。
でいいかと思われますが……。
この回答への補足
御回答ありがとうございます。
解放できないとGDIオブジェクトが増加し続けて、フリーズしてします。
一応、コンストラクタでフォントを作成し、
その後、ボタンやエディットなど各種フォントを設定しているんですが、その際、大きさ(ポイント)などを変更するために、m_pFont->CreatePointFont()を何回か実行しています。
以下がプログラムです
コンストラクタで、CFont* m_pFont;m_pFont = new CFont;を行い、
その後、OnInitDialog()で以下の処理を行っています。
m_pFont->CreatePointFont(200,"");
((CButton *)GetDlgItem(ID_BTN_START ))->SetFont(m_pFont);
((CButton *)GetDlgItem(ID_BTN_STOP ))->SetFont(m_pFont);
((CButton *)GetDlgItem(ID_BTN_NOIZERE))->SetFont(m_pFont);
((CButton *)GetDlgItem(ID_BTN_END ))->SetFont(m_pFont);
((CButton *)GetDlgItem(ID_BTN_RESET ))->SetFont(m_pFont);
m_pFont->CreatePointFont(140,"");
((CEdit *)GetDlgItem(IDC_EDIT1))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT2))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT3))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT4))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT5))->SetFont(m_pFont);
((CEdit *)GetDlgItem(IDC_EDIT6))->SetFont(m_pFont);
でその後、デストラクタでDeleteObject(m_pFont);
を行っております。
m_pFontは間違いです。 メンバー変数で宣言しています。ご指摘ありがとうございます。
ではどのように処理を行ったら、毎秒、ADボードからくる電圧値(値)をエディットボックスに表示し続けて、GDIオブジェクトが増え続けないか、分かりません。すみませんがよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Excel(エクセル) Excelのマクロについて 1 2023/04/17 17:22
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) エクセル VBA 条件付き書式 簡略化したい 2 2022/06/02 17:46
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) エクセル2019の関数を教えてください。 8 2022/12/16 12:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAにて、2GB超の点群デ...
-
VBでのシューティングゲーム
-
符号付きにすべきか、符号なし...
-
絶対パスの取得について
-
clispの実行方法
-
実行時のCPU使用率を増やしたい
-
あっち向いてホイのプログラム...
-
Macターミナルで実行中のプログ...
-
Windows10でDOSゲーム
-
パソコンの演算速度について
-
世界一美しいソースコード
-
家電製品の電力周波数を変える機械
-
Mac 乗数の入力方法
-
VBSでのSendKeysでの画面の最小化
-
VBSの処理中一旦処理を止めて再...
-
C言語で、メモリを解放しないで...
-
vb.netでEXCEL起動がうまくでき...
-
怪しいプロセス教えてください。
-
PIC12F683でLEDをスイッチで点...
-
エクセルのメモリ使用状況/Appl...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
win10で、正確な待ち時間の作り方
-
Excelでのセル内容の高速消去方法
-
Excel VBAにて、2GB超の点群デ...
-
小数点を含む数値かどうか判断...
-
プログラム上のCPU稼働率低減に...
-
SQLの速度をあげるには・・・
-
DoEvents関数って何?
-
基本情報技術者試験詳しい方へ...
-
実行時のCPU使用率を増やしたい
-
VC++2010 GDIオブジェクトの解...
-
C言語 時刻差分の算出方法
-
ナップザック問題?をエクセル...
-
Excel(VBA)でSetTimer関数を使...
-
エクセルVBA 時間抜けの取得
-
VBでの簡易電卓の作成(減算方...
-
ノットイコールを教えて下さい
-
If Not c Is Nothing Then ~延...
-
Excel VBA データ削除の高速化
-
絶対パスの取得について
-
テキスト処理の速度の速い言語
おすすめ情報