我试图了解信号/槽在 GUI 程序中的工作原理。例如,如果主程序中的一个槽收到信号,它是否会创建另一个线程来处理该槽?
主窗口.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void finished_result(int);
private:
Ui::MainWindow *ui;
QThread* thread;
Worker* worker;
private slots:
void run_click();
};
主窗口.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),ui(new Ui::MainWindow){
ui->setupUi(this);
}
MainWindow::~MainWindow(){
delete ui;
}
void MainWindow::run_click(){
thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
connect(worker,SIGNAL(task_finished(int)),this,SLOT(finished_result(int)));
// all other necessary signal/slot connections
thread->start();
// do more stuff
}
void MainWindow::finished_result(int x){
// do some stuff
}
在这样的程序中,假设“做更多事情”需要一段时间来处理,并且工作人员在 run_click()
返回之前完成工作。因此,当发出 task_finished(int)
时,run_click()
仍将运行。 finished_result(int)
会立即启动还是等待 run_click()
完成? finished_result(int)
是在与 run_click()
相同的线程中启动还是在新线程中启动?
我的特殊问题是我的“do more stuff”中有一个不相关的QWaitCondition
,该线程会保留该线程一段时间。我希望我的 finished_result(int)
能够继续执行,而无需等待 run_click()
完成。有什么想法如何继续吗?我需要将“做更多的事情”移至新线程中的另一个工作人员吗?
最佳答案
不,信号永远不会创建新线程。
在您的情况下,run_click()
和 finished_result(int x)
将在同一线程中按此顺序执行。当工作线程发出 task_finished(int)
信号时,它将被传输并在主线程的队列中等待,等待 run_click()
完成并因此返回到事件循环。只有这样 finished_result(int x)
才会被调用。
这称为“排队连接”,是跨不同线程使用信号和槽时的默认行为。看看Threads and QObjects从文档中获取更多信息,特别是 Signals and Slots Across Threads 部分.
关于c++ - 信号会创建新线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18502806/