gpt4 book ai didi

c++ - 辅助线程中的QTimer

转载 作者:行者123 更新时间:2023-12-02 10:25:54 25 4
gpt4 key购买 nike

我有一个Worker类,它在另一个线程中进行一些工作,使用moveToThread()放置该线程。在Worker::doWork()方法内部,我还根据任务所需的估计时间创建了一个QTimer,它应发出进度更新。

这是一个例子:

ThreadController::ThreadController()
{
Worker* worker = new Worker;
worker->moveToThread(&m_workerThread);

// ...

m_workerThread.start();
emit startWorker(params); // connected to Worker::doWork()
}


class Worker : public QObject
{
Q_OBJECT

public slots:
Worker::doWork(const QString& params)
{
QTimer* timer = new QTimer(this);
connect( timer, SIGNAL(timeout)), this, SLOT(updateProgress()) );
timer->start(estimateTaskLength() / 100);

// perform work...
}
}

现在,这无法按预期进行。只有在工作完成之后才开始调用 updateProgress()插槽。

最佳答案

当计时器到期时,timeout事件将排队到工作线程QThread的事件队列中。但是,您的 worker QThread正在忙于执行doWork(),因此无法处理该事件。一旦线程完成doWork,控件将返回QThread的事件循环并执行timeout事件。

解决此问题的最简单方法是在整个QCoreApplication::processEvents()执行过程中以一定间隔手动使用doWork()调用事件循环。这将使QThread可以更早地执行timeout事件。

或者,您可以使用其他线程来执行这些估计。如果它们不太注重性能,则甚至可以使用GUI /主线程。 GUI /主线程应该保持对事件的“响应”(否则应用程序似乎挂起),因此它可以及时处理timeout事件。

关于c++ - 辅助线程中的QTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23607294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com