gpt4 book ai didi

c++ - 在线程内启动 QProcess

转载 作者:行者123 更新时间:2023-11-30 02:39:34 26 4
gpt4 key购买 nike

一段时间以来,我一直在努力解决这个基本问题。我正在尝试从一个线程启动一个 QProcess。启动进程工作正常并且进程运行正常,但我的问题是 finished() 信号永远不会发出。

这是我的例子:

我的类变量是

std::atomic<bool>  recording;
QProcess proc;
std::unique_ptr<std::thread> recordingThread;

类(class):

Recorder::Recorder(ParentClass *parent): QObject(parent){

connect(&proc,SIGNAL(finished(int)),this,SLOT(finishedFFMPEG()));
}

void Recorder::start(){

if (!recordingThread){
recording = true;
recordingThread.reset(new std::thread(&Recorder::recordThread, this));
}
}

void Recorder::recordThread(){

while(recording){
//writing frame
}
proc.start("C:\\ffmpeg.exe", QStringList() <<"-i"<< picDir.c_str() << "-r"<< "30" << "-vcodec"<< "ffv1" << filename.c_str());
proc.waitForStarted();
}

void Recorder::stop(){

if (recordingThread) {
recording = false;
recordingThread->join(); recordingThread.reset();
}
}

void Recorder::finishedFFMPEG(){
qDebug() << "finished";
}

start()stop() 是从我的 ParentClass 中的另一个非 GUI 线程调用的。

我尝试了所有方法,包括使用指针、将我的 recordThread() 作为 QThread 运行并在 stop( ) 函数,但我从来没有收到来自进程的 finished() 信号。该过程本身正在正确执行。我知道问题在于不同的事件循环。

如何实现在 recordThread() 完成并捕获 QProcess finished() 信号后启动进程的目标?

最佳答案

我不能说我对您的构造不起作用感到非常惊讶。您在不同的线程中使用 std::thread 执行成员函数 recordThread()。到目前为止,一切都很好。在 recordThread() 中你有一个循环,看起来它收集/创建/写入帧。一旦循环结束,帧就会通过 QProcess 传递给 ffmpeg。至少这是你的意图。我做对了吗?

现在,在 stop() 中清除记录标志,这会导致 while 循环结束。 QProcess 启动。但与此同时,您结束了这个 QProcess 所在的 recordThread() 线程。并且您期望不仅 QProcess 幸存下来(它可能会这样做),而且所有信号/插槽连接都保持完好无损?

我不完全知道 QProcess 会发生什么,可能的竞争,阻塞/非阻塞效果,但我敢打赌你的问题就出在这方面。

还有一件事...我认为在线程 A 中创建 QProcess 是不健康的,但像您一样在线程 B 中启动它。

我会尝试这样的事情(未经测试):

while(recording){
//writing frame
}
QProcess p;
connect(&p,SIGNAL(finished(int)),this,SLOT(finishedFFMPEG()));
p.start(...your ffmpeg stuff...);
p.waitForFinished(-1);

并在 finishedFFMPEG() 中

recordingThread->join(); recordingThread.reset();

然后当 QProcess 完成时线程被杀死。

关于c++ - 在线程内启动 QProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718281/

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