我目前正在考慮QTimer
實現的線程安全性。QTimer線程安全的方法'isActive()'?
在我的應用程序中,我使用bool isActive()
方法來檢查計時器是否正在運行。正如我打算從其他線程使用這種方法,我的想法轉到線程安全考慮。
根據我的研究,方法bool isActive()
不是線程安全的。
這裏是我的假設:
的QTimer
(QTimer source code)的實施表明,bool isActive()
只是檢查,如果該成員變量int id;
大於0:
inline bool isActive() const { return id >= 0; }
這個成員變量在初始化構造函數與INV_TIMER
這是一個定義爲-1
。當定時器啓動時,它將被設置爲int QObject::startTimer(int interval)
的返回值。
/*! \overload start()
Starts or restarts the timer with the timeout specified in \l interval.
If \l singleShot is true, the timer will be activated only once.
*/
void QTimer::start()
{
if (id != INV_TIMER) // stop running timer
stop();
nulltimer = (!inter && single);
id = QObject::startTimer(inter);
}
當在QTimer::start()
從另一個線程執行isActive()
一個電話,在我看來bool isActive()
返回值可能是無效的。
我希望能夠驗證我的假設的人的意見。
爲了達到線程安全性,我只是用互斥體將我的調用包裝到定時器中,就像下面顯示的代碼片段一樣。
class SensorControl : public QObject
{
Q_OBJECT
public:
SensorControl(); // inits and interval-settings are done at implementation
bool Start()
{
QMutexLocker lock(&m_mutexTimer);
return m_pTimer->start();
}
void Stop()
{
QMutexLocker lock(&m_mutexTimer);
return m_pTimer->stop();
}
bool IsMeasuring() const
{
QMutexLocker lock(&m_mutexTimer);
return m_pTimer->isActive();
}
private:
QMutex m_mutexTimer;
QTimer* m_pTimer;
};
QTimer不是線程安全的,甚至不可重入。因此,即使代碼中的互斥體也不會使其安全。 – peppe