【发布时间】:2015-04-18 13:54:03
【问题描述】:
我已经为这个基本问题苦苦挣扎了一段时间。
我正在尝试从一个线程开始一个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 而不是 QThread 有什么原因吗?
-
就像我在帖子中所说的,我确实尝试使用 QThread,但结果相同。
-
你考虑过使用
QFuture< T > QtConcurrent吗?我尽可能多地使用它,它是高水平的,只是省去了很多麻烦+正确利用所有核心 -
这可能是个愚蠢的问题,但你的线程有事件循环吗?
标签: c++ multithreading qt qprocess