QT如何重新启动线程



如何正确地重新启动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 VideoHandler : public QObject
{
Q_OBJECT
QThread videoBurnerThread;
... 
bunch of defintions
...
}

VideoBurner类也是QObject的一个子类

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

对于第一次运行,这是完美的,信号和插槽都工作。当我想";取消";线程。例如,它正在开发一些";"重";我想从主线程停止的计算,所以我用VideoHandler中的cancel函数调用:videoBurnerThread.quit();

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

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

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

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

在我想做";"重";我再次调用videoBurnerThread.start();来重新启动它,在它真正开始做它应该做的事情之前,我从VideoBurner和一些signals中得到了上次执行的函数的结果。

我能以某种方式停止它正在进行的工作,然后重新启动它吗?我试着发送一个";中止";来自VideoHandler的信号,所以它不发射信号,但这不起作用。

我绝对需要&QObject::deleteLater吗?如果是这样,如何在某些函数内正确地重新初始化VideoBurner并重新连接其信号/插槽?

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

  1. 呼叫"这->deleteLater(("在你的工人的最后
  2. 将worker销毁的信号连接到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();
}

相关内容

  • 没有找到相关文章

最新更新