Я создал собственный класс QObject с именем EncodeThread, который выглядит следующим образом:
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();
}
}
Проблема заключается в том, что я использую функцию QThread и moveToThread () в экземпляре EncodeThread, а именно, что, кажется, ничего не происходит. Данные не записываются, и экземпляр никогда не генерирует сигнал, который должен сохранить закодированный файл на диск.
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 и thread объявлены в классе MainWindow. Я сделал функцию set () для вызова EncodeThread encode () после попыток вызвать encode () из основного потока, используя сигналы и QMetaObject не удалось.
Я не новичок в многопоточности, поскольку использовал нативные потоки Windows и Linux, а также различные межплатформенные реализации, но QThreads действительно, кажется, сбивает меня с толку. Любые предложения приветствуются:)