artoon
artoon

Reputation: 739

Qt moveToThread slot not called

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

Answers (1)

TheDarkKnight
TheDarkKnight

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

Related Questions