我按照 Qt SDK 中的示例,在 QThread
子类中启动计时器
但我不断收到警告,线程永远不会启动计时器。
这是代码:
NotificationThread::NotificationThread(QObject *parent)
:QThread(parent),
m_timerInterval(0)
{
moveToThread(this);
}
NotificationThread::~NotificationThread()
{
;
}
void NotificationThread::fire()
{
WRITELOG("A::fire called -- currentThread:" + QString::number((int)currentThread()->currentThreadId()));
QVector<StringPer>* batchVectorResult = new QVector<StringPer>();
emit UpdateGroupNotifications(batchVectorResult);
}
void NotificationThread::run()
{
connect(&m_NotificationTimer, SIGNAL(timeout()),
this,SLOT(fire(),Qt::DirectConnection));
WRITELOG("A::run() worker thread -- currentThread:" + QString::number((int)currentThread()->currentThreadId()));
//SetNotificationTimerFromConf();
QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD));
int interval = val.toInt();
m_NotificationTimer.setInterval(interval);
m_NotificationTimer.start();
QThread::exec();
}
void NotificationThread::SetNotificationTimerFromConf()
{
QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD));
int interval = val.toInt();
m_NotificationTimer.setInterval(interval);
}
void NotificationThread::UpdateNotificationTimerRT(int timerInterval)
{
m_NotificationTimer.setInterval(m_timerInterval);
}
void NotificationThread::Execute(const QStringList batchReqList)
{
QVector<QString>* batchVectorResult = new QVector<QString>();
start();
}
我使用 Execute( )
从主 GUI 启动线程。
最佳答案
问题是您在创建线程对象时由主线程隐式创建计时器。这是因为您的计时器是线程类的成员。
当您尝试启动计时器时,您是在不同的线程中(在 run()
中)执行的,而不是在创建计时器的线程中执行的,这会给您警告。
您需要在要运行它的线程中创建计时器:。更改 NotificationThread
类中 m_notificationTimer
的声明
QTimer m_NotificationTimer;
到
QTimer* m_NotificationTimer;
并在 run()
中创建计时器
m_NotificationTimer = new QTimer(this);
m_NotificationTimer->setInterval(interval);
m_NotificationTimer->start();
关于c++ - QT 线程:获取 QObject::startTimer:定时器不能从另一个线程警告启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6252146/