【发布时间】:2021-01-08 23:41:27
【问题描述】:
我需要一个带有计时器的类,它每 100 毫秒执行一次任务,这个类需要在线程中运行,所以我想将 qtimer 与 qthread 结合起来。
我创建了以下代码:
class Worker : public QObject
{
Q_OBJECT
public:
void setEnabled(bool enable);
public slots:
void initialize();
private:
void doWork();
QTimer *m_timer;
}
void Worker::initialize()
{
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &Worker::doWork, Qt::DirectConnection);
m_timer->start(100);
}
void Worker::setEnabled(bool enable)
{
if(enable)
m_timer->start(100);
else
m_timer->stop();
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc,argv);
QThread *thread = new QThread;
Worker *worker = new Worker;
QObject::connect(thread, &QThread::started, worker, &Worker::initialize);
worker->moveToThread(thread);
thread->start();
app.exec();
delete worker;
delete thread;
}
使用以下命令我可以启用/禁用时间
worker->setEnabled(false); worker->setEnabled(true);
我已经测试过,它工作正常,但我想知道这是否正确?
感谢您的帮助
【问题讨论】:
-
我觉得很好。
-
@JarMan 我看到几个错误(可能是由于没有提供minimal reproducible example),我没有看到任何 QXApplication,同步调用 setEnabled 会导致分段错误,因为 m_timer 的内存直到之后才分离在您的代码中调用显然不知道的初始化,从主线程调用属于新线程的对象,内存泄漏等。
-
好的,我只是快速浏览一下,因为 OP 说“它工作正常”。
-
QThread *thread = new QThread; Worker *worker = new Worker;- 您正在泄漏这些对象。 -
你是对的,worker->setEnabled(false) & worker->setEnabled(true) 不能在代码块内。如果这是禁用/启用计时器的正确方法,那更是一个问题。我已经编辑了代码