Reputation: 739
I have a class Manager
class Manager : public QThread { Q_OBJECT public: Manager(); void run() { taskB = new TaskB(); taskA = new TaskA(); connect(taskA, SIGNAL(signalOk()), taskB, SLOT(onSignalOk())); connect(taskA, SIGNAL(moveOk()), taskB, SLOT(onMoveOk())); connect(taskB, SIGNAL(signal()), taskA, SLOT(onSignal())); connect(taskB, SIGNAL(moveToThreadSignal(QThread*)), taskA, SLOT(onMoveToThread(QThread*))); connect(this, SIGNAL(runSignal()), taskB, SLOT(onRun())); emit runSignal(); } TaskA* taskA; TaskB * taskB; signals: void runSignal(); };
I have also the class TaskA
like this :
class TaskA : public QObject { Q_OBJECT public: TaskA(); void run() { std::cout << "[INFO] : Task run: " << QThread::currentThreadId() << std::endl; emit signalOk(); } public slots: void onSignal() { run(); } void onMoveToThread(QThread * t) { std::cout << "[INFO] : Task A after move to thread: " << QThread::currentThreadId() << std::endl; this->moveToThread(t); std::cout << "[INFO] : Task A after move to thread: " << QThread::currentThreadId() << std::endl; emit moveOk(); } signals: void signalOk(); void moveOk(); };
And I have also the class TaskB
like this
class TaskB : public QObject { Q_OBJECT public: TaskB(); void run() { std::cout << "[INFO] : TaskB run: " << QThread::currentThreadId() << std::endl; emit signal(); } signals: void signal(); void moveToThreadSignal(QThread* t); public slots: void onSignalOk() { std::cout << "[INFO] : TaskB onSignalOk : " << QThread::currentThreadId() << std::endl; } void onMoveOk() { std::cout << "[INFO] : TaskB onMoveOk: " << QThread::currentThreadId() << std::endl; run(); } void onRun() { std::cout << "[INFO] : TaskB emit MoveToThreadSignal: " << QThread::currentThreadId() << std::endl; thread = new QThread(); thread->start(); emit moveToThreadSignal(thread); } private: QThread * thread; };
When I start the Manager with :
Manager *_manager = new Manager();
_manager->start();
the slot onSignalOk()
of TaskB
isn't called.
I think the problem cause is the default parameter Qt::AutoConnection
when I connect my signal but I don't understand.
Upvotes: 0
Views: 505
Reputation: 27611
I suggest starting by not inhering from QThread; it's name is misleading as it's more of a thread manager. The only reason, in my opinion, to inherit from QThread is if you want to change how Qt manages threads.
Instead, just inherit from QObject and move the object to a new thread. This has the advantage of being able to move multiple objects to one new thread, rather than having to create a separate thread for each object if you were to inherit QThread.
Upvotes: 1