- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在考虑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< 的读取进行互斥保护
从你的线程。您为 isActive
和 stop
做了这件事,看起来不错。
请注意,如果您曾调用写入id
的QTimer
的其他方法,您将得到未定义的行为。所以注意不要调用诸如 QTimer::setInterval()
、QTimer::~QTimer()
(!) 之类的东西。也不要使用单次计时器,因为它会写入 QTimer::timerEvent()
中的 id
。
一般来说,包装现有类并添加互斥量是危险的,这是否有效取决于所述类的内部结构,并且很难在所有情况下检查这些。此外,下一个 Qt 版本的内部结构可能会发生变化,也许在下一个版本中 QTimer::timerEvent()
将无条件更改 id
,并且您的解决方案不再是线程安全的.
因此,虽然您的方法有效,但总的来说我不建议采用它。
关于c++ - QTimer的方法 'isActive()'是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43853517/
当(且仅当)我退出我的应用程序时,这些(且仅这些)重复消息出现在命令提示符上: QObject::startTimer: QTimer can only be used with threads st
我有一个 QObject 的子类,称为 myObject,它在构造函数的堆上分配了一个 QTimer 数据成员。 myObject 还有一个插槽,它连接到构造函数中的 QTimer timeout()
考虑以下C++语句(示例from docs): QTimer::singleShot(600000, &app, SLOT(quit())); 如何在.qml JavaScript中执行相同的操作,例
文档中说: In multithreaded applications, you can use QTimer in any thread that has an event loop. To sta
文档中说: In multithreaded applications, you can use QTimer in any thread that has an event loop. To sta
我有一个派生自 QThread 的对象,类定义包括 Q_OBJECT 宏。我在线程中创建了一个计时器,这样我就可以在线程运行时进行一些偶尔的检查;但是,超时事件永远不会发生。 我也试过将计时器设置为单
在 Qt 中,我试图设置一个 QTimer每秒调用一个名为“更新”的函数。这是我的 .cpp 文件: #include "mainwindow.h" #include "ui_mainwindow.h
我刚开始使用 Qt 并了解了 QTimers。不幸的是,他们似乎给出了一个错误,我还没有看到在线描述的这个错误: 错误:C2514:'QTimer':类没有构造函数。 我在 dialog.h 的私有(
我想使用 QTimer 用传感器值更新 GUI。 我尝试了以下非常简单的代码: from pyQt4 import QtCore def f(): try : print ("t
出于测试目的,我有一个简单的设置可以按时间间隔更改标签。似乎信号永远不会发出。我正在使用带有 Qt 插件的 Visual Studio 2010。这是我的设置... Window::Window(QW
我是 QT 的新手。我想弄清楚 QTimer 是如何工作的。我想在每次滴答时打印一些东西。但我无法让它工作。 测试对象.cpp: #include "testobj.h" #include #inc
我考虑过为回调提供额外的参数,但这看起来太复杂了(创建自己的修改后的 QTimer 对象等) 读完 QTimer docs 后我想到的另一件事正在保存 timerID 并检查它,但由于回调中没有任何内
我试图在不同的 QThread 中使用 QTimer,但我无法连接到 QTimer 的 timeout () 插槽。 我做错了什么? 这是我的代码: extern MainWindow *mainCl
这是我的情况: 我已经连接了以下内容: connect(timer, SIGNAL(timeout()), this, SLOT(avg())); timer->start(5000); avg()
我有以下类(class): class MainWindow : public QMainWindow { public: void StartTimer() { timer = new Q
这是我使用 QTimer 的方式: QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(upd
我试图让一个 QTimer 对象按时间间隔计数,连续调用一个函数。我遵循了一个例子,我已经设置了间隔,但它似乎并没有再次开始计数。 这是我正在使用的代码片段 QTimer *timer = new Q
我试图让 QTimer 运行,但它从未触发。我发现了一些关于计时器的其他问题,但问题始终是计时器超出范围。在我的小例子中情况并非如此: 我在自定义 QMainWindow 中创建计时器,这是 .h 文
我目前正在尝试制作蛇游戏以了解有关 QT 和 C++ 的更多信息,但是当我尝试自动移动我的 QGraphicsRectItem 项目时,它会改变速度。我的问题有没有更好的方法可以在没有 QTimer
我的程序消耗的 CPU 时间确实比我希望的要多得多(2 台显示器最多占用 80-90%)。我正在使用 Qtimers,其中一些时间短至 2 毫秒。在任何给定时间,我可以让每个显示器运行 12 个以上的
我是一名优秀的程序员,十分优秀!