如何正确地重新启动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(){};
,这可能是个问题吗?
- 呼叫"这->deleteLater(("在你的工人的最后
- 将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();
}