如何仅在QThread启动后使用QTimer



我想在MainWindow应用程序中使用QTimer。计时器应该在线程启动时启动。我试过:

ct_thread.h

#include <QtCore>
#include <QThread>
#include <QTimer>
class CT_Thread : public QThread
{
    Q_OBJECT
public:
    explicit CT_Thread(QObject* parent = 0);
    QTimer* timer;
    void run();
private slots:
    void on_timer();
};

ct_thread.cpp(版本1(

#include "ct_thread.h"
#include "mainwindow.h"
#include <QtCore>
#include <QDebug>
CT_Thread::CT_Thread(QObject* parent) :
    QThread(parent)
{}
void CT_Thread::run()
{
    timer = new QTimer(0);
    connect(timer, SIGNAL(timeout()), this, SLOT(on_timer()));
    timer->start(1000);
    // do something else
}
void CT_Thread::on_timer()
{
    qDebug() << "Hello World!";
}

这并没有达到";你好,世界&";,即连接不能正常工作。

或者,我尝试在构造函数中进行连接。这连接插槽,但计时器在打开GUI时启动,而不是在用户启动ct_thread时启动。

ct_thread.cpp(版本2(

CT_Thread::CT_Thread(QObject* parent) :
    QThread(parent)
{
    timer = new QTimer(0);
    connect(timer, SIGNAL(timeout()), this, SLOT(on_timer()));
    timer->start(1000);
}
void CT_Thread::run()
{
    
    // do something else
}
void CT_Thread::on_timer()
{
    qDebug() << "Hello World!";
}

我做错了什么?我该如何表达?

提前感谢!

您可以尝试连接专用信号void QThread::started()(https://doc.qt.io/qt-6/qthread.html#started)到您的CT_Thread类的插槽。从那里你可以开始你的QTimer

我假设计时器应该在线程中处理。

线程中缺少一个事件循环。QThread可以在有或没有事件循环的情况下实现。计时器需要一个事件循环(它不能只是中断当前在线程中执行的代码,而是抢先调用on_timer()方法(。

调用exec()将为线程运行事件循环。

void CT_Thread::run()
{
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(on_timer()));
    timer->start(1000);
    // do something else
    exec();
}

请注意,我还为计时器指定了一个父项,以避免内存泄漏。

请注意,计时器还可以跨线程发出事件信号(线程相关性在这种情况下很重要(。默认情况下,线程关联是创建对象的线程,因此在第一个示例中,计时器将线程关联设置为CT_thread实例,并将其事件发布在线程的事件循环中。

最新更新