10

1ミリ秒ごとにトリガーされるタイマーが必要です。このドキュメントでは、スロットの呼び出しは仮想関数の呼び出しよりもはるかに遅い可能性があることを報告しています。

しかし、信号/スロットをイベントの発生と比較すると、どのメカニズムがより速く、より効率的になり、オーバーヘッドが少なくなります。QTimer信号timeout()がスロットに接続されているか、または裸のQObject::startTimer()\QObject::killTimer()QObject::timerEvent()

上記の質問に対する答えは、WindowsとLinuxで同じですか?

4

2 に答える 2

11

QTimerは実際には機能の単なるシグナルスロットラッパーQObject::startTimer()であるため、間違いなくすべてのプラットフォームでより多くのオーバーヘッドが関連付けられます(内部で実装されますQObject::timerEvent()-この関数の実装はtimeout()シグナルを送信するだけです)。

注目すべきQBasicTimerは、機能のより軽量なラッパーQObject::startTimer()です。を使用するQBasicTimer場合でも、を実装する必要がありますQObject::timerEvent()が、タイマーIDが管理されます。このように、aは、aの使いやすさとメカニズムの使用効率のQBasicTimer一部を兼ね備えています。QTimerQObject::startTimer()

于 2012-09-27T19:33:01.677 に答える
7

実際のところ、精度が必要な場合、QTはタイマーが1ms後に正確に実行されることを保証しません。

少なくともQT4.7.Xまで、QTにイベント(イベントループ内で処理)がある場合、すべてのタイマーは「イベントループ内」で内部的に有効期限がチェックされます(その後、信号が発生します)。つまり、他のタスクなどを中断するOSイベントとして実行されることはありません。

取得できるのは、ループ内の他の3つのイベントがそれぞれ0.5秒など必要な場合に、1.5秒後に実行されるタイマーです。

記憶に障害がないことを願っています。数か月前にQTタイマーのコードを調べましたが、タイマーイベントが他のイベントの後で処理されたのか、それとも前に処理されたのか思い出せません。

これがもう少しお役に立てば幸いです。

于 2012-09-28T08:40:49.730 に答える