c++ - QT 线程:获取 QObject::startTimer:定时器不能从另一个线程警告启动

标签 c++ qthread

我按照 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/

相关文章:

c++ - QThread 中未收到 udp 数据包

c++ - Qt4:单独线程中的 while 循环 block GUI

python - 不使用按钮单击更新串行数据

c++ - 如何在用户自定义类中使用 `ifstream` 对象?

c++ - 通过 operator[] 和 .at() 访问 vector 的负索引

c++ - 代码::积木问题

c++ - 使用boost:asio时我是否偏执?

c++ - 复杂的C++模板代码

c++ - 如何向 Qt 中的 QThread 类的特定对象发出信号?

python - 发送自定义 PyQt 信号?