QT踩坑之子线程不能操作UI,否则应用程序卡死

这篇具有很好参考价值的文章主要介绍了QT踩坑之子线程不能操作UI,否则应用程序卡死。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT易踩坑之在子线程中操作UI,造成应用程序卡死!
QT踩坑之子线程不能操作UI,否则应用程序卡死

	QtConcurrent::run([=]() {
	int res = SDKGetMemberInfo(memberNum.toStdString().c_str());
	if (res == 0)
	{
		MainHandler::GetInstance()->TipMessageBox(QString(tr("Examples of briquette elves")));
	}
	});

这里调用SDKGetMemberInfo()接口可能是个耗时操作,因此我们使用QtConcurrent启动一个线程来执行该函数,若返回值为0,则主界面弹出提示语"Examples of briquette elves"(如何弹出提示语就是另一个故事了,这里我们不过多关注,但重要的是!弹出提示语是一个UI操作!)。然后我们会发现,应用程序直接卡死!嘤嘤嘤~怎么肥四……

咳咳,从复杂度、安全性、性能等多方便考虑,QT限制更新、创建UI必须在主线程里完成。怎么解决这个问题呢?

一个好用的解决办法就是把对UI的操作再发送到主线程去,如下:

	QtConcurrent::run([=]() {
	int res = SDKChangeConfChairman(meetNum.toStdString().c_str());
	QMetaObject::invokeMethod(qApp, [this, res]
		{
		if (res == 0)
		{
			MainHandler::GetInstance()->TipMessageBox(QString(tr("Transfer host succeeded")));
		}
		});
	});

这样应用程序就能丝滑地运行起来啦~
简单介绍一下原理:
QMetaObject的invokeMethod()方法用来调用一个对象的信号、槽、可调用的方法。此功能是线程安全的!第一个参数qAPP是被调用对象的指针,位于主线程;第二个参数是方法的名字,这里用一个简单的lambda表达式表示。这样弹出提示的语句(UI操作)就被从子线程发送到主线程了~文章来源地址https://www.toymoban.com/news/detail-464552.html

到了这里,关于QT踩坑之子线程不能操作UI,否则应用程序卡死的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MacOS未能与帮助应用程序通信,不能完成该操作,因为不能读取或写入等解决方法

    桌面或者文稿中的文件无法压缩也无法复制或粘贴,可能是由于iCloud同步了桌面及文稿,我的解决方法如下。 1.首先打开iCloud管理界面,点击iCloud云盘界面  2.点击选项 3. 将桌面与文稿文件夹这一项关掉,再打开(可能会提示关闭同步后会删除掉所有桌面文件,这里没有关系

    2024年02月12日
    浏览(87)
  • PyQt应用程序中的多线程:使用Qt还是Python线程?

    多线程模块能够更加高效得完成任务,但是在PyQt 应用程序中实现多线程可以使用 Qt 的线程模块(QThread)或者 Python 的 threading 模块。两者各有优劣,具体选择取决于项目需求和个人偏好。下面我们将以案例来说明两种模块具体得优缺点。 1、问题背景 在 PyQt 应用程序中,编

    2024年02月22日
    浏览(55)
  • excel启动时显示“操作系统当前的配置不能运行此应用程序”

    excel启动时显示“操作系统当前的配置不能运行此应用程序” 程序:Office2016版中的excel程序 我在安装office2016版本的时候,由于c盘空间实在不太够,所以我选择通过更改注册表的方式改到D盘下安装office的主体程序,安装完成并成功注册后,我挨个打开office内的word、ppt与exce

    2024年02月06日
    浏览(83)
  • 掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)

    说明:在复现过程中出现两点问题(1)run()函数中对m_diceValued的赋值(2)do_timeOut()函数中没有对m_seq、m_diceValued进行定义。修改后的复现程序如下所示: 主线程: .h .cpp 工作线程: .h .cpp

    2024年02月07日
    浏览(82)
  • 【Qt】如何在Qt应用程序中使用设计好的UI文件

    本质上,Qt Designer的ui文件是一个以XML格式书写的文件,文件中内容描述了一个界面的widget关系树。这个文件在以下两种情况下会使用到: (1)在编译的时候,这意味着ui文件将被转换为可编译的c++代码,这个过程由 uic 完成。 (2)在应用程序运行的时候,ui文件将由 QUiLoa

    2024年01月16日
    浏览(48)
  • VS中Qt项目不能打开ui文件

    在VS中创建的Qt项目,若不能打开ui文件,或者弹出以下提示的:其本质是找不到designer.exe的路径 那么需要手动添加designer.exe的路径 第一步:右键点击打不开的ui文件,选择打开方式 第二步:点击添加 第三步:点击右侧浏览查找对应的Qt编译器安装路径的designer,然后点击确定

    2024年02月13日
    浏览(51)
  • QT非UI线程更新UI(跨线程更新UI)

    笔者最近在弄一个QT的一个小工具,需要把日志格式化输出,但是方法的执行过程是耗时的,如果不自己进行处理就会阻塞主界面,瞬间降低软件的使用体验。 所以通过查资料发现QT的信号传递更新UI非常好用,记录一下,也给碰到类似问题的小伙伴直接提供一个参考。 首先

    2024年02月12日
    浏览(47)
  • Android Toast工具类 解决Toast不消失 解决非UI线程不能Toast的问题

    觉得有用,请  点赞  +  关注 ,您的支持是我最大的动力! 觉得有用,请  点赞  +  关注 ,您的支持是我最大的动力! 觉得有用,请  点赞  +  关注 ,您的支持是我最大的动力!

    2024年02月16日
    浏览(38)
  • 【修改完Qt的UI界面再运行却不能实时更新的解决方法】

    如博客标题所述。例如:当我们在ui界面中添加了某个控件(如按钮)之后,右键项目名称点击运行(对应绿色右三角),显示的界面却还是原来未修改的界面。 这个问题在网上已经有很详细的解释了。具体地,首先需要明白,在我们更改完ui界面、点击运行之后将会重新产

    2024年02月12日
    浏览(44)
  • Qt子线程控制主界面UI控件

    在子线程里控制主界面的UI控件有两种方法:第一种是在子线程中发送信号,然后在主线程中去更新;第二种方法是在子线程中创建同样的对象,然后把主界面中控件的指针赋给创建的对象。 第一种方法在此不做实例展示,在此通过一个简单的例子展示第二种方法: 下面是主

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包