2014-01-15 3 views
0

Я просмотрел документацию, и я не нашел что-то о повторном использовании уникального идентификатора.Получает ли QTimer уникальный идентификатор?

В документации сказано о функции StartTimer:

The function returns a unique integer timer ID 

Но как долго это будет уникальным? Повторно использует ли идентификаторы в какой-то момент?

+0

Я был в состоянии проследить весь путь вплоть до QAbstractEventDispatcher. cpp/.h под src/qtbase/src/corelib/kernel для Qt 5.2. В верхней части этого файла задаются параметры, а затем вы можете заглянуть в QAbstractEventDispatcherPrivate :: allocateTimerId(). – Huy

+0

Согласно [документации] (http://qt-project.org/doc/qt-4.8/qtimer.html#alternatives-to-qtimer) существует возможность создания количества таймеров, равных числу таймеров, которые может обеспечить операционная система. –

ответ

0

Но как долго он будет уникальным?

Идентификатор таймера должен оставаться уникальным до тех пор, пока он не будет выпущен через QAbstractEventDispatcherPrivate :: releaseTimerId();

Другими словами, вызов killTimer().

Повторное использование идентификаторов в какой-то момент?

Я быстро написал простой тест, чтобы увидеть, если таймер ID будет получить повторно:

something.h:

#include <QCoreApplication> 
#include <QtCore> 
#include <QtGlobal> 

class Something : public QObject 
{ 
    Q_OBJECT 

public: 
    Something() : QObject() {} 
    ~Something() {} 

}; 

main.cpp:

#include "Something.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    Something thing; 

    int i = thing.startTimer(1000); 
    qDebug() << i; 

    thing.killTimer(i); 

    i = thing.startTimer(1000); 
    qDebug() << i; 

    return a.exec(); 
} 

Результат :

1 
1 

Наконец, используя QTimer исключительно ... Вы можете проверить с:

class Something : public QObject 
{ 
    Q_OBJECT 

public: 
    Something() : QObject(), timer(NULL) {} 
    ~Something() {} 

    void runme() 
    { 

    timer = new QTimer(); 
    // Old school ;) 
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timerEvent())); 
    timer->start(100); 
    } 

public Q_SLOTS: 

    void timerEvent() 
    { 
    qDebug() << timer->timerId(); 
    timer->stop(); 

    delete timer; 
    timer = new QTimer(); 
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timerEvent())); 
    timer->start(1000); 

    } 

public: 
    QTimer* timer; 
}; 

Тогда просто пнуть его и запустить его:

Something thing; 
    thing.runme(); 
+1

Скорее используйте 'timer-> deleteLater()', чем удалять прямо, сигнал 'QTimer :: timeout()' все еще выполняется. – RobbieE

+0

Когда я делаю то, что вы (начало/убить/старт), я получил идентификаторы 654311482 и 687865914. – Vincent

Смежные вопросы