Ubuntuでは、Qtを使ってC++でアプリケーションを開発しています。 QTimer
を使用していますが、正確さが十分ではありません。私はミリ秒以上の解像度で何かを探しています。これを行う方法はありますか?Qtのサブミリ秒タイマー
私のコード:
temps= 0;
dataTimer = new QTimer();
connect(dataTimer, SIGNAL(timeout()), this, SLOT(simuler()));
dataTimer->start(1);
Ubuntuでは、Qtを使ってC++でアプリケーションを開発しています。 QTimer
を使用していますが、正確さが十分ではありません。私はミリ秒以上の解像度で何かを探しています。これを行う方法はありますか?Qtのサブミリ秒タイマー
私のコード:
temps= 0;
dataTimer = new QTimer();
connect(dataTimer, SIGNAL(timeout()), this, SLOT(simuler()));
dataTimer->start(1);
私はあなたがいないが確実は(Linuxデスクトップがリアルタイムシステムではありません)実際に便利なアクションためのサブミリ秒の遅延を得ると確信しています。おそらくCONFIG_PREEMPT
で自分のカーネルをコンパイルすると少し助けになるかもしれません!しかし、これは強い制限です(それを克服するためのソフトウェアトリックはありません)。
Karsten Koopとコメントされていますが、スレッドまたはPOSIXタイマーを使用している可能性があります。あなたは、C++ 11モードでコンパイル<chrono>
を使用することを検討している場合、Dropはコメントしtime(7)
としても参照してください。(それは、多かれ少なかれは、C++ 11準拠した方法でclock_gettime
をラップ;あなたはメジャーにできるようになりますSOU小遅延)。あなただけ対策(ない行為)サブミリ秒の精度で時間にしたい場合は
A Linuxの具体的な解決策は
(QSocketNotifierを使用して)timerfd_create(2)を使用してQtのメインループでそのFDをポーリングするかもしれません、ちょうど使用clock_gettime(2)
いくつかのQt操作は、実行するのに必要な時間が1ミリ秒以上必要です。そして、人間は、サブミリ秒の遅延を知覚することができない(例えば、画面上に見る)ことはできない。画面は60Hz(またはの画面では、高価なの画面では144Hz)でリフレッシュされるので、そのような小さな遅延は表示されません。あなたは、Linuxのプログラミングに慣れていない場合
、上記のハイパーリンクされた材料の加えでAdvanced Linux Programmingを読むのに時間がかかるワーカースレッドで
いかが 'usleep'(ALP本は
timerfd_create
よりも古いですか)?または[POSIXタイマー](http://man7.org/linux/man-pages/man2/timer_create.2.html)を見てください。 –'QElapsedTimer'は非常に精度の高い時間を許しますが、残念なことにLinuxでは使用できません。必要な処理を行うサードパーティのタイマーがあるかもしれません。 –
@JonHarper私に例を挙げてください – BkarimCe