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

現在、VC++2010 MFCでアプリケーションを作成しています。
そこで質問なんですが、

エディットボックスに値(今回はADボードからサンプリングした電圧値)をSetWindowTextや、UpdateData(FALSE);をつかってエディット表示などをしたんですが、これを毎秒表示しようとすると(SetTimer()で毎秒、ADボードで電圧値をサンプリングしエディットボックスに表示)7分後くらいにパソコンがフリーズしてしまいます。どのようにしたらフリーズされないか
よろしくお願いします。

A 回答 (4件)

MSDNに「CreatePointFont 関数を使って作成された CFont オブジェクトを使い終わったら、最初にデバイス コンテキストからフォントを選択して、それから、CFont オブジェクトを削除します。

」と書いてありますので、CreatePointFont関数で作成したフォントの使用後、次のCreatePointFont関数を使用する前にオブジェクトを削除する必要があるのでは。
フォントを作成し続けて削除しないため、GDIリソースが足りなくなっていると思われます。
    • good
    • 0

コードを出したらいかが?って言ってるんだけど。



> ADボードだけならフリーズはしませんでした。
そこまで分かったのなら、表示処理がおかしいと思われるけど、ソースコードが無いんじゃ非常に効率が悪い。
とりあえずタイマから呼び出される関数の中身が見たい。

多分 #2のいう通り資源管理の問題と思われるが、ソースがないんじゃぁね。。。.

この回答への補足

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

以下がコードとなっております。

ヘッダー部で、CFont* m_pFont;宣言し、
コンストラクタでm_pFont = new CFont;を行っております。
デストラクタでDeleteObject(m_pFont);を行っています。
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);


後はSetTimer(1,1000,NULL)を行い、毎秒以下の処理を行っています。

void OnTimer(UINT_PTR nIDEvent)
{
m_pADControl->AD_In_Out(AD1,AD2,AD3,AD4,AD5,AD6);
UpdateData(TRUE);
m_xvEditVolt[0] = AD1;
m_xvEditVolt[1] = AD2;
m_xvEditVolt[2] = AD3;
m_xvEditVolt[3] = AD4;
m_xvEditVolt[4] = AD5;
m_xvEditVolt[5] = AD6;

UpdateData(FALSE)
}

以上の処理を行うと、タスクマネージャなどで調べるとGDIオブジェクトが増加し続け、9999になると
フリーズしてしまいます。

ではどのようにしたらGDIオブジェクトが増加し続けないか教えてもらったら幸いです。
よろしくお願いします。

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

そのエディットボックスの表示部分を何か変更していませんか?


フォントとか背景用のブラシとかを変えている場合、毎回作成して解放していないと、GDIリソースが枯渇してシステム全体の表示が正しく行えなくなります。実行中にタスクマネージャでGDIオブジェクトの数を監視して、増加し続けているようであれば、解放漏れがあると思います。
    • good
    • 0
この回答へのお礼

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

確かに エディットボックスのフォントなどを変更しています。
その後 解放していませんでした

お礼日時:2013/05/30 18:08

これだけの情報で一発で正答にたどり着くのは無理だと思う。


まず、問題点の切り分けが大事(デバッグの基本)。再現性が高いのなら、原因にたどり着くことは可能と思う。

多分、この処理はいくつかの処理に分割されていると思うが、それぞれコメントアウトしていってフリーズしなくなったら、その部分は原因である可能性が高い。ただし、問題がいくつかの処理の相互作用によるものだとしたら、これだけでは原因にたどり着くことは困難。

ADボードのサンプリング処理を実行せず(ダミーの値を返すようにしておく)、エディットボックスを毎秒表示したらどうなりますか?
ADボードのサンプリング処理を毎秒実行し、エディットボックスの表示をしなかったらどうなりますか?
そこいら辺を確かめたあと、問題がある部分のコードを出したらいかが?

この回答への補足

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

ADボードを使用せず、エディットボックスを毎秒表示するとやはりフリーズしました
ADボードだけならフリーズはしませんでした。

SetWindowText関数をコメントアウトするとフリーズしなくなります。

補足日時:2013/05/30 15:27
    • good
    • 0

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