みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Visual Studioのタイマ処理を使って描画を行うプログラムを

Visual Studioのタイマ処理を使って描画を行うプログラムを
作成したのですがうまくいきません.
プログラムの開発環境はWindows XP SP2でVC++6.0

外部に接続したセンサからのデータを50Hzで サンプリングして
そのデータを元に描画を行う予定なのですが計測時間が100秒を超えると
異常終了してしまいます.

原因がよく分かりません.
どうしたらよいのでしょうか?


void CMyDlg::OnSamplingStart()
{
i=0;
// サンプリング用タイマ開始
//なぜか12にするとちょうど50Hzでサンプリングする
SetTimer(1,12,NULL); // 0.02秒毎タイマ割り込み,50Hz
}


void CMyDlg::OnTimer(UINT nIDEvent)
{
/*
ここで,センサからのデータをサンプリングし,いろいろな計算をする.
*/
CDC* pDC=m_pict.GetDC();

CRect myRECT;
m_pict.GetClientRect(myRECT);
pDC->FillSolidRect(myRECT, RGB(255,255,255));

CPen BlueBoldPen,*OldBlueBoldPen;
BlueBoldPen.CreatePen(PS_SOLID,5,RGB(0,0,255));

OldBlueBoldPen=pDC->SelectObject(&BlueBoldPen);

pDC->MoveTo((int)(X0/10),(int)(Y0/10));
pDC->LineTo((int)(L3_x[i]/10),(int)(L3_y[i]/10));
pDC->LineTo((int)(C7_x[i]/10),(int)(C7_y[i]/10));

// ペンを元に戻す
pDC->SelectObject(OldBlueBoldPen);

BlueBoldPen.DeleteObject();

m_time=(double)i/50;
UpdateData(FALSE);

i=i+1;

CDialog::OnTimer(nIDEvent);
}

計測終了はボタンを押して終了します.

どうが具体的な解決策を教えてください.

投稿日時 - 2010-05-15 15:59:13

QNo.5896817

すぐに回答ほしいです

質問者が選んだベストアンサー

> CDC* pDC=m_pict.GetDC();

これに対する ReleaseDC() が見当たりませんが、きちんと解放していますか?
デバイスコンテキストは不要になった時点で必ず解放してください。

 m_pict.ReleaseDC(pDC);

投稿日時 - 2010-05-16 17:48:35

お礼

プログラムを修正して試したところ成功しました.

本当に困っていたので助かりました.

ありがとうございました.

投稿日時 - 2010-05-16 18:20:05

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

SetTimerのタイムアウト値が12msなので、
100秒経てば変数 i の値は 8333 になり、
配列のサイズ8000を超えてしまいます。

//なぜか12にするとちょうど50Hzでサンプリングする

とありますが、この50Hzというのは果たして
タイムアウト処理が起動された回数でしょうか?

試しにタイムアウト処理の中に
if (i == 7999) {
i = 0; // ブレークポイント設定場所(処理はダミー)
}
とか書き加えて、Debugモードでブレークポイントに止まるかどうか
確認してみてください。

投稿日時 - 2010-05-15 22:05:35

補足

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

>試しにタイムアウト処理の中に
if (i == 7999) {
i = 0; // ブレークポイント設定場所(処理はダミー)
}
とか書き加えて、Debugモードでブレークポイントに止まるかどうか
確認してみてください。



確認してみたところブレークポイントには止まりませんでした.

実際に90秒計測してみたところ,iの値は4500とります.

タイマが遅れているのか,SetTimerのタイムアウト値を12にすると
ちょうど実時間と同じように時間を刻みます.
計測時間は

m_time=(double)i/50;
UpdateData(FALSE);

で確認しています.

実際の計測は計測時間を90秒としています.
一回目の計測では問題なく計測できるのですが,二回目の計測では5秒ぐらい計測した
あたりで異常終了しています.
描画をコメントアウトすると二回目,三回目と問題なく計測できます.

コメントアウトした場合,一回目の計測ではメモリの使用量は増加しますが,
二回目,三回目では増加しません.これは一回目に使用した変数や配列を使用したためだと思います.

しかし,描画した場合では二回目でもメモリの使用量は増加します.

これが何かの原因の一部ではないのでしょうか?


何か解決策があれば願いします.

投稿日時 - 2010-05-16 16:10:18

ANo.1

変数 i の宣言と 配列 L3_x、L3_y、O7_x、O7_y の宣言を見直してください。
i の値が配列より大きくなるとバッファがあふれます。

投稿日時 - 2010-05-15 16:13:36

補足

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

変数iと配列L3_x,L3_y,C7_x,C7_yの宣言は

int i=0;
doubleC7_x[8000];
doubleC7_y[8000];
doubleL3_x[8000];
doubleL3_y[8000];

と,宣言しています.

描画するところをコメントアウトすると問題はありませんでした.

描画するとメモリの使用量がやけに多いのでそれが原因でしょうか?

投稿日時 - 2010-05-15 17:38:29

あなたにオススメの質問