gpt4 book ai didi

c++ - QTimer的方法 'isActive()'是线程安全的吗?

转载 作者:行者123 更新时间:2023-11-28 05:09:15 25 4
gpt4 key购买 nike

我目前正在考虑QTimer 实现的线程安全问题。

在我的应用程序中,我使用 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::isActive,那么您的解决方案看起来是安全的。 isActive 仅访问 id 成员变量,因此您需要对所有对 id 的写入和对 id< 的读取进行互斥保护 从你的线程。您为 isActivestop 做了这件事,看起来不错。

请注意,如果您曾调用写入idQTimer 的其他方法,您将得到未定义的行为。所以注意不要调用诸如 QTimer::setInterval()QTimer::~QTimer() (!) 之类的东西。也不要使用单次计时器,因为它会写入 QTimer::timerEvent() 中的 id

一般来说,包装现有类并添加互斥量是危险的,这是否有效取决于所述类的内部结构,并且很难在所有情况下检查这些。此外,下一个 Qt 版本的内部结构可能会发生变化,也许在下一个版本中 QTimer::timerEvent() 将无条件更改 id,并且您的解决方案不再是线程安全的.

因此,虽然您的方法有效,但总的来说我不建议采用它。

关于c++ - QTimer的方法 'isActive()'是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43853517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com