- 締切済み
VC++2010 エディットボックスに値を表示
現在、VC++2010 MFCでアプリケーションを作成しています。 そこで質問なんですが、 エディットボックスに値(今回はADボードからサンプリングした電圧値)をSetWindowTextや、UpdateData(FALSE);をつかってエディット表示などをしたんですが、これを毎秒表示しようとすると(SetTimer()で毎秒、ADボードで電圧値をサンプリングしエディットボックスに表示)7分後くらいにパソコンがフリーズしてしまいます。どのようにしたらフリーズされないか よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- nitoplus
- ベストアンサー率0% (0/0)
MSDNに「CreatePointFont 関数を使って作成された CFont オブジェクトを使い終わったら、最初にデバイス コンテキストからフォントを選択して、それから、CFont オブジェクトを削除します。」と書いてありますので、CreatePointFont関数で作成したフォントの使用後、次のCreatePointFont関数を使用する前にオブジェクトを削除する必要があるのでは。 フォントを作成し続けて削除しないため、GDIリソースが足りなくなっていると思われます。
- maru_yoshi_
- ベストアンサー率39% (17/43)
コードを出したらいかが?って言ってるんだけど。 > ADボードだけならフリーズはしませんでした。 そこまで分かったのなら、表示処理がおかしいと思われるけど、ソースコードが無いんじゃ非常に効率が悪い。 とりあえずタイマから呼び出される関数の中身が見たい。 多分 #2のいう通り資源管理の問題と思われるが、ソースがないんじゃぁね。。。.
- m-take0220
- ベストアンサー率61% (480/785)
そのエディットボックスの表示部分を何か変更していませんか? フォントとか背景用のブラシとかを変えている場合、毎回作成して解放していないと、GDIリソースが枯渇してシステム全体の表示が正しく行えなくなります。実行中にタスクマネージャでGDIオブジェクトの数を監視して、増加し続けているようであれば、解放漏れがあると思います。
お礼
御回答ありがとうございます。 確かに エディットボックスのフォントなどを変更しています。 その後 解放していませんでした
- maru_yoshi_
- ベストアンサー率39% (17/43)
これだけの情報で一発で正答にたどり着くのは無理だと思う。 まず、問題点の切り分けが大事(デバッグの基本)。再現性が高いのなら、原因にたどり着くことは可能と思う。 多分、この処理はいくつかの処理に分割されていると思うが、それぞれコメントアウトしていってフリーズしなくなったら、その部分は原因である可能性が高い。ただし、問題がいくつかの処理の相互作用によるものだとしたら、これだけでは原因にたどり着くことは困難。 ADボードのサンプリング処理を実行せず(ダミーの値を返すようにしておく)、エディットボックスを毎秒表示したらどうなりますか? ADボードのサンプリング処理を毎秒実行し、エディットボックスの表示をしなかったらどうなりますか? そこいら辺を確かめたあと、問題がある部分のコードを出したらいかが?
補足
御回答ありがとうございます。 ADボードを使用せず、エディットボックスを毎秒表示するとやはりフリーズしました ADボードだけならフリーズはしませんでした。 SetWindowText関数をコメントアウトするとフリーズしなくなります。
補足
御回答ありがとうございます。 以下がコードとなっております。 ヘッダー部で、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オブジェクトが増加し続けないか教えてもらったら幸いです。 よろしくお願いします。