• ベストアンサー

マルチスレッドにする必要がありますか?

<プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース シングルスレッド <目的のプログラム仕様> ・ダイアログのボタンを押すとOnボタン関数に入る ・Onボタン関数で関数1(無限ループ)と関数2(無限ループ)を実行する ・関数1はnDataの内容を更新し続ける(37回/sec) ・関数2はnDataの内容を基に、数秒かかる処理を10秒毎に行う <今の知識で出来るコーディング> void Onボタン関数(){  int nData[10];  関数1(nData);  関数2(nData); } void 関数1(int nData[]){  for(;;) for(int i=0;i<10;i++) nData[i] = 更新データ; } void 関数2(int nData[]){  int nTotal=0;  DWORD dwOldTime = clock();  for(;;){   if(clock() - dwOldTime >10000){//10秒経過で実行    dwOldTime = clock();    for(int i=0;i<10;i++) nTotal += nData[i];//実際は数秒かかる程の処理    nTotal = 0; //初期化   }  } } <問題点> 今の知識で出来るコーディングでは、関数1の無限ループから処理が 他へ移ることは無く、関数2を実行する事が出来ません。 関数2の合計を計算する処理は、実際には数秒かかるので、 関数1で関数2を呼び出すことが出来ません。 (関数1は37回/secでデータ更新しなければならないので) <質問> 目的のプログラム仕様を満たすには、マルチスレッドにしなければ ならないでしょうか? シングルスレッド、マルチスレッド、どちらの方法でも良いので、 どのようにコーディングすれば良いのか教えて下さい。 宜しければ、ご指摘お願い致します。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

nDataの同期は必要なんでしょう 10秒ごとに関数Bを実行するのですが これは 関数Aで収集した10秒間分のデータが対象なのでしょうか そうなると データのバッファが足りないですね 関数Bを実行している間も 関数Aでの収集があるのでしたら 10秒間ぎりぎりのバッファでは 計測器からのデータの取りこぼしが懸念されます 1回のデータが10バイト 関数Bの最悪のケースの場合5秒かかるとするなら 少し余裕を見て20秒分のバッファ 740( 20 * 10 * 37 )バイト必要でしょう マルチスレッドにするなら CWinThreadクラスで ワーカースレッドを作成する方法調べてみましょう この際に スレッドの実行本体 ThreadProc内でイベントを待ち受けるように WaitForSingleObjectなどで待機させます 関数A側で既定のデータを収集できたら関数Bを待機させるために使った Eventハンドル(またはCEventクラスオブジェクト)をPulseEventまたはSetEventなどで反転させて関数Bの本体を実行しましょう Eventハンドルなどは 自動リセットイベントなどが手間がなくていいかもしれません バッファデータのどの範囲が関数Bで扱うのかはThreadProcに渡す LPVOIDのパラメータにて行うようにしましょう

meeyooyoo
質問者

補足

redfox63様、有難うございます。 nDataは10個のデータを上書きしているので、バッファは10バイト分で十分です。 データ上書きを一秒間に37回行うことで、常に最新のデータ10個 が得られる感じです。 10秒毎に、その時点で最新の10個のデータを使って処理する。 といったイメージです。 CWinThreadクラスで ワーカースレッドを作成する方法について、 ネットで調べたのですが、良く分かりませんでした。 ネット上のプログラムをコピーしても、エラー多発でした。 基本的な部分のコーディングを教えて頂けないでしょうか? ワーカースレッドが作成できましたら、WaitForSingleObjectなどで イベント待ちにしたいと思います。 宜しければご指摘お願い致します。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

関数1と2は全く関連が無い(同期をとらなくてよい)のでしょうか? もし、そうであるなら、マルチスレッドになるでしょう。 http://msdn.microsoft.com/ja-jp/library/cc429080.aspx あと、if(clock() - dwOldTime >10000){//10秒経過で実行 こういうことをすると、CPUを無駄使いするので、Sleepとか、タイマ 割り込みを考えるべきです。もの凄くもったいないです。

meeyooyoo
質問者

補足

nda23様、有難うございます。 CreateThreadについて、ネットで調べたのですが、使い方が 理解出来ませんでした。 CreateThreadはどこで実行するのでしょうか? Onボタン関数()の中でしょうか? どのようにコーディングするのか教えて頂けますと幸いです。 CPUを無駄使いしないように、割り込みを使うようにします。 宜しければご指摘お願い致します。

関連するQ&A

専門家に質問してみよう