gpt4 book ai didi

QT如何重启一个线程?

转载 作者:行者123 更新时间:2023-12-05 07:02:05 26 4
gpt4 key购买 nike

如何正确重启一个QThread?我一直在谷歌搜索这四个小时,但找不到任何具体答案。

我有的是基本的moveToThread实现:

VideoHandler::VideoHandler()
{
VideoBurner *videoBurner = new VideoBurner;
videoBurner->moveToThread(&videoBurnerThread);

connect(this, &VideoHandler::signalVideoData, videoBurner, &VideoBurner::setVideoData);
connect(this, &VideoHandler::signalVideoBurn, videoBurner, &VideoBurner::initVideoBurn);

// don't really want it since there is only 1 object
//connect(&videoBurnerThread, &QThread::finished, videoBurner, &QObject::deleteLater);

connect(videoBurner, &VideoBurner::burnProcess, this, [=](QString step, int percentage){
emit burningProcess(step, percentage);
});
}

这是我类(class)的声明:

class VideoHandler : public QObject
{
Q_OBJECT
QThread videoBurnerThread;
...
bunch of defintions
...
}

VideoBurner类也是 QObject 的子类

class VideoBurner : public QObject
{
Q_OBJECT
...
bunch of definitions
...
}

对于第一次运行,它运行完美,信号和槽都可以正常工作。当我想“取消”线程时会出现问题。例如,它正在进行一些我想从主线程停止的“繁重”计算,所以我调用:videoBurnerThread.quit();cancel来自 VideoHandler 的函数.

我不wait()在它上面,因为它会阻塞主线程。

quit()触发器 &QThread::finished ,但我注释掉了该连接,因为它破坏了我唯一的对象实例。

(我也找不到任何创建对象并将其放在构造函数外部线程上的示例,如果可能的话?当我尝试时,应用程序会正常关闭)

我发现 quit()只停止事件循环,除此之外什么都不做,这导致了 restarting 的问题胎面。

在我想再次做“繁重”的事情之后,我调用 videoBurnerThread.start();重新启动它,我从 VideoBurner 得到最后执行的函数的结果还有一些signals从它开始,在它真正开始做它应该做的事情之前。

我能否以某种方式停止它正在处理的内容并重新启动它?我尝试从 VideoHandler 发送“中止”信号所以它不会发出信号,但这没有用。

我真的需要 &QObject::deleteLater 吗?所以它停止了吗?如果是这样,如何重新初始化 VideoBurner正确地在某些功能内部并重新连接它的信号/插槽?

VideoBurner 中也没有逻辑析构函数只是一个 public: virtual ~VideoBurner(){}; ,这可能是个问题吗?

最佳答案

  1. 在你的 worker 结束时调用“this->deleteLater()”。
  2. 将 worker destroyed 信号连接到 Handler 函数中的线程退出槽。

请引用此代码段。

if(!dataThread.isRunning())
{
worker = new Worker();
dataThread.setObjectName("dataThread");
worker->moveToThread(&dataThread);
QObject::connect(&dataThread, &QThread::started, worker, &Worker::run);
QObject::connect(worker, &Worker::destroyed, &dataThread, &QThread::quit);
QObject::connect(worker, &Worker::set_counter_label, this, &MainWindow::update_counter);
dataThread.start();
}

关于QT如何重启一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63679382/

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