【问题标题】:Timer in thread's worker Qt线程工作者 Qt 中的计时器
【发布时间】:2024-01-17 01:32:02
【问题描述】:

我正在尝试在工人阶级中使用计时器。这是我的 Worker 类:

Worker.h

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:
    void finished(void);

public slots:
    void process(void);
    void test(void);

private:
    QMutex m_mutex;

};

工人.cpp

void Worker::process(void)
{
    qDebug() << "worker process";       //This works
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(test()));

    forever
    {

    }
}

void Worker::test(void)
{
    qDebug() << "test123";   //This does not work
}

我在新线程中启动这个工作类:

QThread *thread = new QThread;
    Worker *worker = new Worker;
    worker->moveToThread(thread);

    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()), Qt::QueuedConnection);
    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
    QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));

    thread->start();

问题是来自Worker::processtimer 不起作用。我需要以特殊方式在新线程中初始化这个计时器吗?

【问题讨论】:

  • 定时器没有启动,调用定时器的start()方法。文档说“要使用它,请创建一个 QTimer,将其 timeout() 信号连接到适当的插槽,然后调用 start()。”看看doc.qt.io/qt-5/qtimer.html
  • forever { ... } 实际上是做什么的?我希望它时不时地处理事件。

标签: c++ multithreading qt timer


【解决方案1】:

您需要在创建计时器后致电void QTimer::start(int msec) or void QTimer::start()。您的 process() 插槽中也不需要“永远”。

试试这个:

void Worker::process(void)
{
    qDebug() << "worker process";       //This works
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(test()));
    timer->start(1000); // Fire timer timeout each 1000ms.
}

【讨论】:

    最近更新 更多