我创建了一个名为 EncodeThread 的自定义 QObject 类,如下所示:
class EncodeThread : public QObject {
Q_OBJECT
public:
void set(SWSL::Video* v, QStringList f, QDir vDir);
void run();
public slots:
void encode();
signals:
void encodeProgress(int i);
private:
SWSL::Video* video;
QStringList files;
QDir videoDir;
};
显而易见,此类用于使用外部库对视频进行编码。Encode() 包含实际的编码例程,run() 是我在故障排除时添加的一个函数,尽管它显然没有功能:
void EncodeThread::run() {
if (currentThread() != this) {
// caller is in different thread.
QMetaObject::invokeMethod(this, "encode", Qt::QueuedConnection);
}
else {
encode();
}
}
问题是当我在 EncodeThread 实例上使用 QThread 和 moveToThread() 函数时,似乎什么也没发生。没有数据被写入,并且实例永远不会发出应该将编码文件保存到磁盘的信号。
encThread.set(video, files, videoDir);
connect(&encThread, SIGNAL(encodeProgress(int)), cookVideoProgress, SLOT(setValue(int)));
connect(&encThread, SIGNAL(finished()), this, SLOT(videoCookEnd()));
connect(this, SIGNAL(videoEncode()), &encThread, SLOT(encode()));
encThread.moveToThread(&thread);
thread.start();
以上是整个设置的启动方式。EncThread 和线程变量在 MainWindow 类中声明。在尝试使用信号从主线程调用 encode() 并且 QMetaObject 失败后,我已经使 EncodeThread 调用 encode() 的 set() 函数。
我对线程并不陌生,我使用过本机 Windows 和 Linux 线程,以及各种跨平台实现的线程,但 QThreads 似乎真的让我感到困惑。任何建议都非常受欢迎:)