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変数とthread変数は、MainWindowクラスで宣言されています。シグナルを使用してメインスレッドからencode()を呼び出そうとした後、EncodeThreadのset()関数でencode()を呼び出しましたが、QMetaObjectが失敗しました。
私はスレッド化に不慣れではなく、ネイティブのWindowsスレッドとLinuxスレッド、およびさまざまなクロスプラットフォーム実装のスレッドを使用しましたが、QThreadsは本当に私を困惑させているようです。どんな提案も大歓迎です:)