01-09-2019 04:54 AM
開発言語C++でオシロスコープの様なアプリを開発中です。
先ず、NI-Daqmxより複数チャンネルのアナログデータを取得してメモリマップドファイルに書き込み
溜まったデータを別スレッドで随時描画していくアプリを開発しています。
USBからのデータ取得なので若干の遅延があるのはしょうが無いと思うのですが
何とか描画されているのですが、スペックの問題なのか、別の端末で同アプリを動かすと明らかに描画速度が遅くなってしまいました。
(描きはじめは0.5秒ほど遅延しても良いけどその後は、1秒の幅をほぼ1秒で描画させたい)
ここで質問する内容と少しずれていると思いますが
いろいろと解決方法を探したのですが見つからず大変困っています。
端末のスペックに左右されないで描画する方法は何かありませんでしょうか?
ご助力をお願い致します。
01-20-2019 10:35 PM
C++でNI-DAQmxのプログラムを作成する際に、サンプルプログラムがご参考になるかと思いますが、こちらはもう見てみられましたか?
01-20-2019 11:46 PM
Tanabe様
ご確認ありがとうございます。
はい。サンプルプログラムは一通り確認しました。
データの取得はC-ANSIサンプルを複数チャンネルに変更して使用しています。
このデータを用いた描画方法について何か参考になる方法があれば教えて頂けないかと思い投稿いたしました。
DAQのタスクの中で取得したデータをメモリに随時追記していき
別タスクで溜まっているデータを随時ループして描画しているのですが
描画の速度がループ処理時間に左右されてしまい、端末のスペックによっては
もの凄く遅かったり早かったりしてしまうので一定にできないものかと模索しています。
01-24-2019 12:23 AM - 編集済み 01-24-2019 12:34 AM
端末のスペックによってループの繰り返し速度が一定ではないことが問題であるとの事で、例えばLabVIEWでは、「待機(ms)」関数という関数が用意されており、ソフトウェアタイミングでのループの繰り返し速度を制御することができます。「1秒の幅をほぼ1秒で描画させたい」と最初にお書きになっていらっしゃいましたが、ループに「待機(ms)」関数を置き、1000msを設定することで、PCのスペックに関わらず一秒に一回ループが繰り返される動きになります。
C++でプログラムをご構築中との事ですが、恐らくC++でもループの繰り返し速度を制御するような関数が用意されていると思いますので、そちらをご使用になられて繰り返し速度を一定にされていはいかがでしょうか。
01-24-2019 01:31 AM
返信ありがとうございます。
待機関数=usleepみたいなものでしょうか?
処理開始からループ処理中の経過時間を測定して、処理が早すぎたら残りのデータ量から計算して待機させて1秒に調整するというやり方でしょうか?
ただ、それだとスペックが低いと遅くなってしまうので、できれば避けたいと考えております。
計算処理等いろいろ入れると逆に遅くなってしまうので何かいい方法が無いか未だに模索しています。
色々調べた結果私の考えていた方法(処理タイミングではなくて、処理の実行速度を調整する)では無理そうなので
別案できれいなリアルタイム描画をする方法を検討しています。
現実案では、一回に描画するデータ量を少なくして待機描画させてみようと考えています。
サンプル数を増やして0.1秒とか0.05秒以下のデータ分ずつで描画&反映処理をすれば、カクツキも気にならないかなぁ?っと。
01-24-2019 08:29 PM
LabVIEWの待機関数では、お書きになられました通り、「処理が早すぎたら残りのデータ量から計算して待機させて1秒に調整するというやり方」になります。PCのスペックが低くて1秒に間に合わなかった場合には、遅延が発生するかエラーが出ると思います。
1秒間のループの繰り返しが可能なスペックを持ったPCを用意するのが一番良いと思いますが、難しい場合には「現実案では、一回に描画するデータ量を少なくして待機描画」での対処となるかと思います。
01-24-2019 09:25 PM