在线程内启动 QProcess
Starting QProcess inside a thread
我一直在为这个基本问题而苦苦挣扎一段时间。 我正在尝试从线程启动QProcess
。启动进程工作正常,进程运行正常,但我的问题是永远不会发出finished()
信号。
这是我的例子:
我的类变量是
std::atomic<bool> recording;
QProcess proc;
std::unique_ptr<std::thread> recordingThread;
班级:
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()
函数中启动QProcess
,但我从未从过程中收到finished()
信号。进程本身正在正确执行。我知道问题在于不同的事件循环。
如何实现在recordThread()
完成后启动进程并捕获QProcess
finished()
信号的目标?
我不能说我对你的结构不起作用感到非常惊讶。您可以在不同的线程中使用 std::thread 执行成员函数 recordThread()。目前为止,一切都好。在 recordThread() 中,你有一个循环,它看起来像是收集/创建/写入帧。一旦循环离开,帧就会通过 QProcess 传递到 ffmpeg。至少这是你的意图。我做对了吗?
现在,在 stop() 中清除记录标志,这会导致 while 循环结束。Q开始。但与此同时,你结束了这个 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);
并在完成FFMPEG()
recordingThread->join(); recordingThread.reset();
然后,当 QProcess 完成时,线程被杀死。
- QProcess不启动java应用程序
- QProcess可以启动程序,但不能启动python(命令行)
- 如何在Windows上通过QProcess启动提升的子进程?
- 该命令在QProcess中启动,不会返回Linux上的响应
- 启动后向 QProcess 发出命令
- Qprocess启动的嵌套远程过程仍然是僵尸
- 将CTRL C事件发送到使用Windows上使用Qprocess启动的过程
- 无法使用 QProcess 启动 g++
- 在线程内启动 QProcess
- QProcess启动过程(搅拌机.exe)具有多个参数
- QT:无法在启动/停止按钮中终止 Qprocess
- 启动 QProcess 并一次读取一行输出
- Qt:无法使用QProcess启动Windows控制台
- 如何使用QProcess启动Shell脚本
- 在窗口错误中使用QProcess启动进程:"Timers can only be used with threads started with QThread"
- 如何并行启动几个QProcess并阻塞,直到所有QProcess都退出
- 暂停并恢复 Qt 中由 QProcess 启动的子进程
- CreateProcess可以启动一个进程,但QProcess不能.为什么
- 如何使用QProcess在控制台窗口中启动和终止cmd.exe
- 在参数列表中使用绝对路径启动QProcess