QT中connect连接信号槽中使用lambda函数注意点

注意点:

信号槽的的默认连接方式为autoconnect的方式.

当信号的发射位置(也即emit写的位置)与槽函数的接收者在同一个线程中时,默认就是直连的连接模式, 当发送信号时,立即执行槽函数.

当信号的发射位置(也即emit写的位置)与槽函数的接收者在不同的线程中时,默认就是队列的连接模式, 当发送信号时,将把信号发送到接收者线程的事件队列中,等事件队列执行到该信号时再执行槽函数.

重点:不是信号发送者与槽函数的接收者所处线程来判断,而是信号发送的位置与接收者所处线程来判断.

cpp 复制代码
  connect(m_pGenCode, &QThread::started, 
      this, &qwaGrindProcessDS::slotStartGenCode);

  connect(m_pGenCode, &QThread::started,
      [this]() {qInfo() << "started lambda:" << QThread::currentThreadId(); });
  connect(m_pGenCode, &QThread::started,this,
      [this]() {qInfo() << "started lambda:" << QThread::currentThreadId(); });

m_pGenCode通过继承QThread的方式定义的QThread子类对象指针, 在主窗口中定义.通过重写run函数,来实现的多线程的方式.

所以m_pGenCode与this是在一个线程. 如果需要在不同的线程中,则需要采用movetothread的方式创建线程.2种方式各有优缺点.

cpp 复制代码
connect(m_pGenCode, &QThread::started, this, &qwaGrindProcessDS::slotStartGenCode);

QThread::started()信号是在调用了m_pGenCode->start()时发送的,当start()执行时,会创建一个新的线程,同时发送一个started()信号.所以QThread::started()信号是在新的线程中发送的.

this在旧的主线程中, 所以默认是采用队列的连接模式.

cpp 复制代码
connect(m_pGenCode, &QThread::started,[this]() {
qInfo() << "started lambda:" <<QThread::currentThreadId(); 
});

直接在信号后面写lambda函数,这时候没有接收者,默认这个lambda函数将在新的线程中执行,也即发射信号的线程中执行.采用直接连接模式.

cpp 复制代码
  connect(m_pGenCode, &QThread::started,this,
      [this]() {qInfo() << "started lambda:" << QThread::currentThreadId();})

在接收者位置多了this,即主窗口线程对象. 这时候发送者与接收者虽然都在同一个线程中,但是信号的发送位置是在新线程中,所以默认为队列连接模式. 这个lambda函数将在this所在线程中执行.

相关推荐
wuhen_n3 分钟前
JavaScript内置数据结构
开发语言·前端·javascript·数据结构
不会代码的小测试6 分钟前
UI自动化-POM封装
开发语言·python·selenium·自动化
roman_日积跬步-终至千里12 分钟前
【Java并发】Java 线程池实战:警惕使用CompletableFuture.supplyAsync
java·开发语言·网络
lsx20240617 分钟前
C++ 基本的输入输出
开发语言
mengzhi啊27 分钟前
QUndoView 本质是一个 Qt 界面控件(继承自 QListView),专门适配 QUndoStack
qt
CodeSheep程序羊29 分钟前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
独好紫罗兰29 分钟前
对python的再认识-基于数据结构进行-a002-列表-列表推导式
开发语言·数据结构·python
I'mChloe37 分钟前
PTO-ISA 深度解析:PyPTO 范式生成的底层指令集与 NPU 算子执行的硬件映射
c语言·开发语言
编程小白20261 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
深蓝海拓1 小时前
PySide6,QCoreApplication::aboutToQuit与QtQore.qAddPostRoutine:退出前后的清理工作
笔记·python·qt·学习·pyqt