У меня есть класс 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(); };
У меня также есть класс TaskA
:
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(); };
А еще у меня есть такой класс TaskB
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; };
Когда я запускаю менеджер с помощью:
Менеджер *_manager = новый менеджер();
_менеджер->старт();
слот onSignalOk()
из TaskB
не называется.
Я думаю, что причиной проблемы является параметр по умолчанию Qt::AutoConnection
, когда я подключаю свой сигнал, но я не понимаю.
thread = new QThread();thread->start();
. Что вы ожидаете от этого кода? - person UmNyobe   schedule 14.08.2014