网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月21日漏签0天
qt吧 关注:49,872贴子:159,884
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 11回复贴,共1页
<<返回qt吧
>0< 加载中...

求助吧友!槽函数的执行线程

  • 只看楼主
  • 收藏

  • 回复
  • 郭源潮94
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


这个sendFile对象是一个runnable对象,我把他移动到了创建的一个线程thread中,在这个对象的一个函数中定义了一个信号connectedOK,发出这个信号的时候触发一个lambda,这个lambda的运行线程是在thread线程是吧,所以说这个QMessageBox的父对象和他不在一个线程,程序就崩溃了,就是无响应。
我对槽函数的执行在线程不理解,我目前也只用过默认的连接方式。
我看的这个视频是这么写的,但是Qt版本不一样。求助各位大佬。
在mainwindow.cpp中定义了一个槽函数,这样连接就解决了。


  • 郭源潮94
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
目前我只用过默认的connect方式,今天遇到了这个问题。开始运行无响应,发现了问题,把QMessageBox注释掉就好了。然后换了定义槽函数的方式。


2025-11-21 21:41:17
广告
不感兴趣
开通SVIP免广告
  • eiilpux17
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
使用lambda时,第三个参数也可以指定任意object,这样lambda就在该object所在线程运行。所以可以使用某个qwidget对象或者qapp,使得在lambda中创建窗口


  • 郭源潮94
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
说错了,sendFile不是继承了runnable的对象,只继承了qobject,昨天口误


  • day巨蟹座的狗
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
QMessageBox是QWidget ,所有的QWidget 只能在UI线程中执行,不然会奔溃,Qt内部用Q_ASSERT 判断当前线程是不是UI线程


  • 郭源潮94
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
经过我的尝试
我总结一下:
首先创建一个线程类,重写run函数,并在run函数中发射一个信号signal1。
我们在主线程中实例化该线程。
线程start之后,运行run函数,发射一个信号siagnal1,我们用匿名函数作为槽函数且不指明接收对象。那么这个槽函数就在这个信号发出的线程中执行。指明接收对象就在接收对象所在的线程中执行。
总之
如果槽函数是lambda表达式,不指明接收对象,那么他就在信号发出的线程执行。指明接收对象就在接收对象所在的线程中执行。
如果槽函数是线程类的成员函数,那就在实例化该线程的线程中执行,比如主线程。


  • 郭源潮94
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼



  • 郭源潮94
  • 小吧主
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
moveToThread方法和普通的线程类的槽函数的执行是一样的,感觉更清晰。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 11回复贴,共1页
<<返回qt吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示