アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、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);
}

A 回答 (4件)

フォントの生成(CreatePointFont() や CreateFont() 等の呼び出し)を OnInitDialog() 以外の場所で行っていないでしょうか。

もし OnInitDialog() だけでしか行っていないのであれば、GDIオブジェクトのリークはフォント以外の別の要因があるように思います。(それとも、プログラム起動中に何度もダイアログの生成と破棄を繰り返すような作りになっていたり…は、さすがにしないですよね)

OnTimer() の処理は質問で提示されたもののみですか?
また、何らかの描画処理を OnPaint() などで自前で行っていたりしないでしょうか?
オーナードローを行っていたり、どこかで GetDC() を呼ぶ処理が入っていたりなどしないかについても確認してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

よく調べていくと、 描画処理の所にブラシの生成を行っていたのが原因でした。

本当にありがとうございます。

お礼日時:2013/06/11 11:50

> DeleteObject(m_pFont);



m_pFont->DeleteObject();

じゃないの?
    • good
    • 0

>その後、ボタンやエディットなど各種フォントを設定しているんですが、その際、大きさ(ポイント)などを変更するために、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オブジェクトが増え続ける問題が発生しています。

補足日時:2013/05/31 11:55
    • good
    • 0

>((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オブジェクトが増え続けないか、分かりません。すみませんがよろしくお願いします。

補足日時:2013/05/31 10:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!