• 締切済み

VC++2010 エディットボックスに値を表示

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

みんなの回答

  • nitoplus
  • ベストアンサー率0% (0/0)
回答No.4

MSDNに「CreatePointFont 関数を使って作成された CFont オブジェクトを使い終わったら、最初にデバイス コンテキストからフォントを選択して、それから、CFont オブジェクトを削除します。」と書いてありますので、CreatePointFont関数で作成したフォントの使用後、次のCreatePointFont関数を使用する前にオブジェクトを削除する必要があるのでは。 フォントを作成し続けて削除しないため、GDIリソースが足りなくなっていると思われます。

回答No.3

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

hanyu-yuugo
質問者

補足

御回答ありがとうございます。 以下がコードとなっております。 ヘッダー部で、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オブジェクトが増加し続けないか教えてもらったら幸いです。 よろしくお願いします。

回答No.2

そのエディットボックスの表示部分を何か変更していませんか? フォントとか背景用のブラシとかを変えている場合、毎回作成して解放していないと、GDIリソースが枯渇してシステム全体の表示が正しく行えなくなります。実行中にタスクマネージャでGDIオブジェクトの数を監視して、増加し続けているようであれば、解放漏れがあると思います。

hanyu-yuugo
質問者

お礼

御回答ありがとうございます。 確かに エディットボックスのフォントなどを変更しています。 その後 解放していませんでした

回答No.1

これだけの情報で一発で正答にたどり着くのは無理だと思う。 まず、問題点の切り分けが大事(デバッグの基本)。再現性が高いのなら、原因にたどり着くことは可能と思う。 多分、この処理はいくつかの処理に分割されていると思うが、それぞれコメントアウトしていってフリーズしなくなったら、その部分は原因である可能性が高い。ただし、問題がいくつかの処理の相互作用によるものだとしたら、これだけでは原因にたどり着くことは困難。 ADボードのサンプリング処理を実行せず(ダミーの値を返すようにしておく)、エディットボックスを毎秒表示したらどうなりますか? ADボードのサンプリング処理を毎秒実行し、エディットボックスの表示をしなかったらどうなりますか? そこいら辺を確かめたあと、問題がある部分のコードを出したらいかが?

hanyu-yuugo
質問者

補足

御回答ありがとうございます。 ADボードを使用せず、エディットボックスを毎秒表示するとやはりフリーズしました ADボードだけならフリーズはしませんでした。 SetWindowText関数をコメントアウトするとフリーズしなくなります。

関連するQ&A

  • エディットボックスの改行

    MFC ダイアログベースでプログラミングしています。 エディットボックスに改行が入らないのですが何故ですか? 以下のソースで実行すると、「1 2」と表示されます。 m_Display = "1 \x0d\x0a 2"; UpdateData(FALSE); UpdateWindow(); また、 int a; の値をエディットボックスに表示させるにはどうしたらよいですか? よろしくお願いします。

  • VC++のエディットボックスの非表示

    VC++で、ダイアログを作りました。 エディットボックスを置いているのですが、 このエディットボックスは始めは非表示(入力を受け付けない)にするため、 このエディットボックスのプロパティにある "Disable"をtrueにして"Visible"もtrueにしました。 そこまではよかったのですが、 「入力」ボタンを押すと、エディットボックスが白く表示され、入力を受け付けるというようにしたいのですが、 エディットボックスのプロパティを変更する関数というのはあるのでしょうか? いろいろ検索などをしているのですが、方法がわかりません。よろしくお願いします。

  • VC++2010のエディットボックスの出力について

    VC++2010のエディットボックスの出力について質問させていただきました。 シリアル通信でデータを毎秒受信するプログラムを作成しており、 9_27_23.4_33.00 というデータを受信して エディットボックスに表示しているんですが 9_27_23.4_33.00 9_27_23.4_33.00 9_27_23.4_33.00 ・ ・ ・ という表示を期待しているんですが 改行されず上書きされてしまいます CString szRecvの中に受信データが格納されており szRecv = szRecv +"\r\n"を記述しても 改行されませんでした。 どのようにしたら うまく 改行されて表示されるのか よろしくお願いします

  • VC++2010 MFC エディットボックスの質問

    VC++2010 MFC エディットボックスの質問なんですが、 バリュー型変数を使わないでどうやったら配列(char型8byte(unsigned char[8]))の中身すべてをエディットボックスにいれて表示することができますか?よろしくお願いします。配列の中身は文字もあったりします

  • VC++2010 GDIオブジェクトの解放方法

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

  • VC++2010 エディットボックスのリードオンリ

    現在は私はVC++2010 MFCでアプリケーションを開発しています。 エディットボックスのプロパティにリードオンリーの機能があるんですが、 プログラムで実現しようとするとどのようにしたらよろしいのかわかりませんでしたので 質問させていただきました。 ではよろしくお願いします

  • UpdateData( FALSE); による文字列データの表示更新(VC++6.0)

    VC++の超初心者です. UpdateData( FALSE ); を用いてエディットボックスの文字列の表示の更新を 試みているのですが,たとえば,以下のコードのようにボタンをクリックした際に文字列表示の更新を複数回行おうとするとうまくいきません. 具体的には一回目のUpdateData( FALSE );が反映されず二回目のUpdateData( FALSE );のみ反映されるという症状です. なおm_mojiretsuはCstring型でエディットボックスのDDX用の変数です. void CMyDlg::OnButton1() { DWORD p; m_mojiretsu=_T("mojirstu1"); UpdateData( FALSE ); /*5秒の待ち*/ p=timeGetTime(); while(1){if((timeGetTime()-p)>5000) break;} m_mojiretsu=_T("mojirstu1\r\nmojirstu2"); UpdateData( FALSE ); } 何か別の処理を行わなければいけないのでしょうか. どこかに根本的なミスがあるのでしょうか. VC歴3日程度で,右も左も分からず大変困っております.よろしくお願いします.

  • エディットボックスのテキストが表示されないのはなぜですか

    VC++初心者です。 以下のソースでエディットボックスのテキストが表示されません。というか、最後のループの時のみ表示されますが、一回一回表示するにはどうしたらいいでしょうか? void CCRPTC_accessDlg::OnBnClickedOk() {  int i;  CEdit* myEdit1 = (CEdit*)GetDlgItem(IDC_EDIT1);    ・    ・    ・  for (i=1;i<10;i++){   if (Ret != SUCCESS)   {    myEdit1->SetWindowText("NG!");   }   else   {    myEdit1->SetWindowText("OK!");   }  } }

  • VC++6.0 エディットボックス小数点表示

    VC++6.0 エディットボックス小数点表示のサンプルがあるサイトあれば お教えください

  • 文字列と変数の値をエディットボッスクに表示させたい

    VC++6.0,MFC,ダイアログベースでプログラミングしています。 エディットボックスに文字列と変数の値を表示させたいのですが、その方法が分かりません・・。 コンソールベースの場合の、 int a=1; printf("a = %d",a); で、「a = 1」と出力されるようにしたいです。 今は、 m_Display = "a = %d"; UpdateData(FALSE); UpdateWindow(); というように作っているので、上記と同様にできませんでした。 このような場合どうしたらよいのでしょうか? よろしくお願いします。

専門家に質問してみよう