스레드에서 실행해야하는 클래스가 있으며 슬롯에 대한 이벤트 루프가 필요합니다. 현재는 moveToThread()
으로 실행하지만, QThreadPool
을 사용하고 싶습니다. 문제가 발생했습니다.QThreadPool 내에서 슬롯을 실행하십시오.
풀링 스레드 (나는 QThread::currentThread()
과 함께이를 확인)에서 호출 QThreadPool
내 실행 가능한의 run()
방법으로 실행,하지만 내 슬롯은 풀 스레드에서 실행하지 않는, 그래서 객체가 이동되지 생각할 때 풀의 thread
슬롯이 정확히 QThread
인 moveToThread()
메서드를 사용할 때 얻을 수있는 (올바른) 동작 인 수신기의 스레드에서 실행된다는 것을 알고 있기 때문에 이것을 생각합니다.
내 QRunnable
(아래 예에서 Foo)을 풀링 된 스레드에서 완전히 실행하려면 어떻게해야합니까? 아니면 내가 잘못하고 있거나 잘못 이해 한 것입니까?
다음 POC는 문제를 보여줍니다
foo.h을
#ifndef FOO_H
#define FOO_H
#include <QObject>
#include <QRunnable>
#include <QEventLoop>
class Foo : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit Foo(int data, QObject *parent = 0);
void run();
signals:
void startWorking();
public slots:
void doWork();
private:
QEventLoop eventLoop;
int data;
};
#endif // FOO_H
foo.cpp에
#include "foo.h"
#include <QThread>
#include <QDebug>
Foo::Foo(int d, QObject *parent) :
QObject(parent), eventLoop(this), data(d)
{
}
void Foo::run()
{
qDebug() << "run() in: " << QThread::currentThread();
connect(this, SIGNAL(startWorking()), this, SLOT(doWork()));
emit startWorking();
eventLoop.exec();
}
void Foo::doWork()
{
qDebug() << "doWork() in: " << QThread::currentThread();
}
MAIN.CPP
#include <QCoreApplication>
#include <QThreadPool>
#include "foo.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Foo *foo = new Foo(42);
QThreadPool::globalInstance()->start(foo);
return a.exec();
}
그러나 실제 코드에서는 네트워크에서 일부 데이터가 수신되기 때문에 신호가 즉시 방출되지 않습니다.
추 신 : POC는 here입니다.
connect(this, SIGNAL(startWorking()), this, SLOT(doWork()));
당신의 연결 전화 이후
흥미 롭다. 나는 이것을 줄 것이다. – Paul
+1, 문제가 해결 된 이후로 답을 표시했습니다. 실행 파일이 아니라 작업자에서 이벤트 루프를 실행 중이므로 정확하게 말한 것이 아닙니다. – Paul