簡體   English   中英

Qt moveToThread插槽未調用

[英]Qt moveToThread slot not called

我有一個類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時:

經理* _manager = new Manager();

_manager->開始();

onSignalOk()TaskB不被調用。

我認為問題原因是當我連接信號但我不理解時的默認參數Qt::AutoConnection

我建議從不繼承QThread開始; 它的名稱具有誤導性,因為它更像是線程管理器。 我認為,從QThread繼承的唯一原因是您是否想更改Qt管理線程的方式。

相反,只需從QObject繼承並將對象移動到新線程即可。 這樣的優點是能夠將多個對象移動到一個新線程,而不是如果要繼承QThread則必須為每個對象創建單獨的線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM