分享一下今天我去面试,面试官给我抛出的一个问题:
Qt信号槽与多线程的关系?
我的回答:没有关系。
他告诉我,是有关系的,Qt的信号槽是通过线程去操作顺序的,比如槽的第五个参数为队列,那么就是在槽函数不会在主线程。
我说我记得我打印过线程id,都是在主线程,
他说:不对的,你自己回去试试。
于是我回来搜索了很多,没有发现网上相关的任何回答,搜到的大多是关于多线程中使用信号槽的问题。
于是我做了如下实验:
使用一个按钮,按钮点击的时候就是触发一次信号,这个信号触发的槽函数里面打印当前线程id,来判断是否会出现不同线程的情况。
代码:
.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void testSig();
private slots:
void slotClicked();
void testSlot();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
cpp
#include "mainwindow.h"
#include <QPushButton>
#include <QDebug>
#include <QThread>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
ui->setupUi(this);
QPushButton *button =new QPushButton(this);
connect(button,&QPushButton::clicked,this,&MainWindow::slotClicked);
connect(this,&MainWindow::testSig,this,&MainWindow::testSlot,Qt::QueuedConnection);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slotClicked()
{
qDebug()<<"发送前" <<QThread::currentThreadId();
emit testSig();
}
void MainWindow::testSlot()
{
qDebug()<<"发送后" <<QThread::currentThreadId();
}
不断的替换信号槽的第五个参数,打印都是和主线程的线程id相同
我寻思这是否作证了信号槽不是使用线程去控制的
期待大佬们的出现,帮我想想到底怎么样的是正确的。
目前我还是认为信号槽和线程没有关系。而信号槽是依赖于事件循环的。