1

ミニ サンプル ファイルmain.cpp:

#include <iostream>
#include <QCoreApplication>

class MyApp : public QCoreApplication
{
private:
    int m_idtimer;

public:
    MyApp(int nargs, char* argc[]) : QCoreApplication(nargs, argc)
    {
        m_idtimer = startTimer(3000); // 3 segs.
    }

protected:
    void timerEvent(QTimerEvent* e)
    {
        char c = '\0';

        std::cout << "timerEvent" << std::endl;
        std::cin >> c;

        if (c == 'q') {
            killTimer(m_idtimer);
            quit();
        }
    }
};

int main(int nargs, char* argc[])
{
    MyApp app(nargs, argc);

    return app.exec();
}

エクストラミニMakefile

LDFLAGS = -I/usr/include/qt4 -I/usr/include/qt4/QtCore
LDLIBS = -lQtCore

コンパイルと実行:

$ make main
g++   -I/usr/include/qt4/QtCore  main.cpp  -lQtCore -o main
$ ./main
timerEvent
1
timerEvent
2
timerEvent
3
timerEvent
q
$

では、私の質問です。このサンプルは、タイマー イベントが累積的かどうかをテストする目的で作成しました。

mainプログラムを実行すると、次のことが起こります。

  • 最初のtimerEventメッセージは 3 秒後に表示され、1timerEvent()文字待機します。
  • 一気に押し1ます。
  • 3 秒後、2 番目のtimerEventメッセージが表示されます (予想どおり)。
  • 数秒(15秒以上)待ってから押します2
  • 3 番目のメッセージがすぐに表示されます (1 つのタイマー イベントが蓄積されます)。
  • 3すぐ押します。
  • そして 3 秒後に 4 番目のメッセージが表示されます (これ以上タイマー イベントは蓄積されません)。
  • を押すqとプログラムが終了します。

質問: タイマー イベントが蓄積されないのはなぜですか? この動作はプラットフォームに依存しますか?

PD: Qt のバージョンは 4.8、SO Ubuntu 13.04、カーネル (Linux) は 3.8.0-19-generic です。実行中のグラフィック システムは Gnome 3 です。

4

1 に答える 1

1

timerEvent入力待ちのコードがブロックされるため、15 秒間待機してもタイマー イベントは蓄積されません。入力を入力するまで、Qt はイベント ループに戻ることができません。イベント ループに戻ると、経過時間をチェックし、3 秒以上経過していることに気づき、タイマー イベントを発生させます。15 秒が経過したという事実は関係ありません。

これは予想される動作であり、プラットフォームに依存しません (すべきではありません)。

于 2013-06-13T00:10:45.453 に答える