c++ - 信号会创建新线程吗?

标签 c++ qt signals-slots qthread

我试图了解信号/槽在 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/

相关文章:

c++ - 对象 A 是 B 的成员,对象 B 是 A 的成员

c++ - Clang 和 GCC 中不明确的基类转换之间的行为差​​异

c++ - 检测到碰撞后删除用户定义的 qGraphicItems

python - PyQt:计算太长时发出两次信号

python - pyqt4在线程中向主线程中的插槽发出信号

Java Final 关键字 vs C++ 常量指针 vs C++ 引用

c++ - 迭代器和*迭代器类型

c++ - Qt GLSL纹理只出现一种颜色

qt - 在 JSON 中编码 QString

c++ - 使用清晰的代码行异步调用插槽,无需连接到它