I는 다음과 같습니다 EncodeThread라는 사용자 지정있는 QObject 클래스를 만들었습니다QThread는 사용하기 전에 실행/종료하지 않습니다.
으로 분명있을 수 있습니다,이 클래스는 외부 라이브러리를 사용하여 비디오를 인코딩하는 데 사용됩니다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;
};
. 그것은 분명 작동하지 않는 비록 인코딩()는 실행 실제 인코딩 루틴,()는 내가 문제 해결하면서 추가 기능을 포함
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 및 스레드 변수는 MainWindow 클래스에서 선언됩니다. 신호를 사용하는 주 스레드에서 encode()를 호출하고 QMetaObject를 호출하지 못한 후에 EncodeThread 호출 encode()의 set() 함수가 실패했습니다.
네이티브 Windows 및 Linux 스레드뿐만 아니라 다양한 크로스 플랫폼 구현의 스레드를 사용하여 스레딩에 익숙하지는 않지만 QThread는 실제로 나를 당황하게합니다. 모든 제안은 환영보다 더 많습니다 :)
언제'videoEncode() '신호가 방출됩니까? –
원래 스레드를 시작한 직후 videoEncode() 신호가 방출되었지만 현재 문제에 비해 동작이 변경되지 않았습니다. – MayaPosch