qt- thread —— 关于槽函数所在线程的问题

QT之多线程(QThread)的简单使用 一、线程简述 线程(thread)是操作系统能够进行运算调度的最小单位。一条线程指的是进程中一个单一顺序的控制流,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。如一边解码一边播放视频,提高了效率,节约了时间。 Qt中通过QThread直接支持多线程,QThread是一个跨平台的多线程解决方案 ,QThread以简洁易用的方式实现多线程编程 二、线程状态 多个线程全部启动(new)进入就绪队列 执行后处于运行状态,不运行就处在阻塞状态 .. 阅读详情

背景: 利用线程,串行发送4个http请求并接受数据

子类化QThread得到downlaodThread ,利用downloadThread进行网络通信。

downThread结构:在run函数中发送http get请求,将finished()信号与槽函数httpFinished()相连。 同时开启事件循环。

部分代码:

qnam=new QNetworkAccessManager();
connect(qnam,SIGNAL(finished(QNetworkReply*)),this,SLOT(httpFinished(QNetworkReply*)));
downloadFile();
this->exec();

httpFinished为downloadThread的成员,处理收到的数据并利用quit()结束当前线程。


主线程中的代码如下

for(int x=0;x<2;x++)
for(int y=0;y<2;y++)
{
downlaodThread *th=new downlaodThread(“***************"));
th->start();
th->wait();
}



发生的问题:程序死锁。


原因:即使httpFinished在QThread中声明,但是它所属的类QThread依附于主线程,因此调用该槽函数需要在主线程内执行。

而主线程被th->wait挂起,因此发生如下逻辑: 主线程等待工作线程结束后wake up,而工作线程需要在主线程的槽函数中结束自身。因此死锁


重点:QThread的成员函数(run除外)的代码在主线程中执行。


思路来源 http://blog.youkuaiyun.com/lynfam/article/details/7081757


使用Qt中的QThread创建线程 文章目录1. 使用信号和槽的形式触发2. 使用继承自QThread方式触发3. 几点说明 上篇文章中简单介绍了如何使用 Windows API 和c++11中的 std::thread 创建线程。 线程的创建和基本使用 本篇文章将会介绍如何使用QThread创建线程。 QThread是Qt所有线程控制的基础,每一个QThread实例对象控制一个线程。 QThread可以直接实例化使用也可以用... 阅读详情

相关推荐

qt线程启动后等待返回_QT5 Thread线程

QT5 Thread线程继承QThread方式一.首先分析一下 QTimer Class与 Sleep()函数之间的秘密QTimer *t = new QTimer(*parent); //创建QTimer 对象t->start(_time); //计时开始每隔_time时间自动触发&QTimer::timeout信号t->stop(); //结束计时Sleep() //win...

weixin_39607865的博客 557

Qt之QThread(深入理解)

简述 为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程。对于耗时操作如果不使用线程,UI界面将会长时间处于停滞状态,这种情况是用户非常不愿意看到的,我们可以用线程来解决这个问题。 前面,已经介绍了QThread常用的两种方式: Worker-Object 子类化QThread 下面,我们来看看子类化QThread在日常中的应用。 简述 子类化QThread 线程休眠...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1万+

Qt线程报错Cannot create children for a parent that is in a different thread

本来就是个qt新手,还遇到了这个线程错误,折磨了我三四天,终于找到原因所在,在此记录一下。 以下是报的错误代码: QObject: Cannot create children for a parent that is in a different thread Parent is QTextDocument(0x1275d90), parent’s thread isQThread(0x7affe0), current thread is QThread(0x8b8170) Segmentation f

weixin_44139476的博客 5511

Qt 多线程(QThread)

Qt 多线程(QThread) 一.理解QThread 关于QThread,参考qt助手中的解析 Detailed Description A QThread object manages one thread of control within the program. QThreads begin executing in run(). By default, run() starts the event loop by calling exec() and runs a Qt event loop i

null_plus的博客 5045

QT多线程的实现方式:QThread run优雅的创建与退出【QT多线程】

QThread 是用来管理线程的,它所依附的线程和它管理的新线程并不是同一个东西QThread 所依附的线程,就是执行创建QThread的线程。也就是咱们这儿的主线程,QThread 管理的新线程,就是 run 启动的线程。所以总结一句话:QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里那么就抛出两个问题1.QThread的对象依附在主线程中,次线程的slot函数会在主线程中执行,而不是次线程。除非:(不建议这样做)

吻等离子的博客 1万+

LTE信令流程及业务流程

eNB返回E-RAB建立响应消息,E-RAB建立列表信息中包含成功建立的承载信息,E-RAB建立失败列表消息中包含没有成功建立的承载消息。3)当下行数据达到时,网络侧先对UE进行寻呼,随后UE发起随机接入过程,并发起service request过程。用户面:S-GW向eNB发送承载建立请求,包含(IMSI, QoS, TFT, TEID, LBI等)控制面:MME向eNB发送E-RAB建立请求,包含E-RAB ID,QoS,S-GW TEID。3)在S1接口上建立S1承载,在Uu接口上建立数据无线承载。

qq_44390640的博客 4581

Qt中线程的使用

qt中线程的使用

qq_43812868的博客 728

基于Apache SeaTunnel构建CDC数据同步管道

Apache SeaTunnel是一个数据集成开发平台,其发展经历了几个重要阶段:ETL时代(90年代):面向结构化数据库的数据同步,用于构建数据仓库。MPP和分布式技术流行:使用技术如Hive进行数据仓库的构建。此阶段主要使用mapreduce程序进行数据搬运和转换。数据湖技术流行:重视数据集成,强调先同步数据至数据湖仓储,再进行业务面向的转换和设计。CDC,即变更数据捕获,是一种捕获数据库变更事件(如插入、更新、删除)的技术。

weixin_54625990的博客 2172

qt connect 连接返回true,依然无法响应槽函数

如果在主函数 直接调用 类A 得方法,将在(调用线程)主线程执行,默认得run方法中存在exec(), 有事件循环才能响应槽函数。thread.start(), 会调用默认得run方法。使用信号绑定 类A 得方法,能在线程中执行。解决方法,使用movetothread,自定义得run 方法未调用exec。注意是否跟线程有关。

qq_30235767的博客 922

告别‘小爱同学’:用ESP32-S3和esp-sr SDK,从零打造一个离线语音助手(含完整代码)

本文详细介绍了如何利用ESP32-S3芯片和esp-sr SDK从零构建一个离线语音助手,涵盖硬件选型、声学设计、SDK配置及低功耗优化等关键步骤。通过实战案例和完整代码,帮助开发者实现自定义唤醒词和命令词,打造低成本、高隐私的本地语音控制解决方案。

weixin_29041195的博客 370

从零开始理解二极管限幅:5种典型电路设计及实际应用场景解析

本文系统解析了二极管限幅电路的五大经典拓扑,包括串联与并联型上下限幅及双向限幅。通过剖析其核心原理与二极管的单向导电性、正向压降特性,结合ADC输入保护、电源管理、音频处理等实际应用场景,提供了从器件选型到设计陷阱规避的完整实战指南,帮助工程师为信号构建可靠的“安全笼”。

2y3u4i5o6p的博客 1034

Qt定时执行:必须用槽函数吗?

Qt定时执行:槽函数并非必须

xie__jin__cheng的博客 595

Python爬虫实战:模拟登录B站 – 处理Cookie和加密参数

由于B站在登录过程中采用了多种安全措施,包括加密的请求参数和cookie验证,模拟登录成为一项具有挑战性的任务。首先,我们需要获取B站的登录页面,并解析出其中的CSRF令牌和其他隐藏的字段。B站的登录接口通常会包含一些动态的加密参数,我们需要在登录前通过GET请求获取这些信息。本文详细介绍了如何使用Python模拟登录B站,解决加密参数的处理、图形验证码的识别以及登录后的数据抓取。库中的加密方法加密登录请求中的密码。一旦登录成功,我们可以通过维护会话状态,抓取登录后的数据,如个人主页、评论、观看记录等。

2201_76125261的博客 1308

Qt使用 std::thread 线程插入数据到 QTableWidget

QThread 使用的时候有时候不太方便,所有使用c++标准库里面的thread。我的需求就是使用一个线程去更新 QTableWidget 里面的数据。因为我的界面主线程总是比这个子线程晚结束。我就采用的 detach ,把这个更新数据的线程分离出去。在整个应用使用的是不安全的单例来作为线程执行函数。在线程中通过发射 updateProductInfo 信号,让GUI主界面线程去响应这个信号去更新表格的内容。

洪源兄 1930

UG NX二次开发(C#)--详细讲述编程模板NXOpen_CS_Wizard的代码意义,帮你轻松进入NXOpen(C#)二次开发

有几个读者私信问我,在看了“NX1957在VS2019上二次开发的环境配置”后,能完成了UG NX二次开发(C#)模板的配置,也能根据模板创建工程,但是对工程文件.cs不甚理解;并且,在UG Styler新建完成后,其也有一个dlx文件和.cs文件,也不清楚怎么使用。本文先对UG NX二次开发(C#)模板文件进行讲解,在下一个博客中,讲解Styler新建后的模板文件。以上就是对编程模板NXOpen_CS_Wizard(c#)的讲解,其实只要明白了逻辑关系,编程实现只是时间问题,祝你好运。

GimiGimmy 1785

双目摄像头全景解析:从几何光学到深度智能

双目视觉系统基于仿生学原理,通过水平排列的双摄像头模拟人眼视差机制实现三维感知。其核心是通过标定、校正、匹配等算法流程,将视差转换为深度信息,最终生成三维点云。该系统在自动驾驶、机器人导航、工业检测等领域有广泛应用,但面临弱纹理、重复图案等挑战。未来发展趋势包括与事件相机、深度学习等技术的融合,进一步提升精度和动态性能。

reset2021的博客 120

QT多线程的使用(moveToThread方法)

QT有两种实现多线程的方法,一种是“子类化QThread,然后去重写run函数,实现多线程”。一种是“子类化QObject,然后使用moveToThread函数实现多线程”。由于QT官方推荐使用第二种方法,所以我这里主要介绍一下,如何通过子类化QObject去实现多线程。 首先,我们写一个继承QObject的类,并且在第一行写上Q_OBJECT,在定义一个子线程实现功能的函数。thread.h代...

Xm行墨的博客 3万+

把 SNC 支持的通信链路一次讲透,SAP GUI、RFC、CPIC、SAProuter 到底谁在保护谁

摘要: SNC(Secure Network Communications)是SAP系统中用于保护特定通信链路的安全机制,主要应用于DIAG、RFC、CPIC等SAP协议,而非HTTP等互联网协议(后者由SSL/TLS处理)。其核心在于保护通信端点之间的逻辑链路,需在发起方和接收方同时配置SNC参数,包括SNC名称、保护等级(QoP)等。实际项目中,SNC的配置涉及多个层面,如SAP GUI到ABAP平台的登录链路、外部程序通过RFC/CPIC连接ABAP的认证、ABAP系统间的跨系统通信等。配置不当可能导

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 250

QT中如何实现Thread与GUI的主线程连通

QT中如何实现Thread与GUI的主线程连通 本文介绍的是QT中实现Thread与GUI主线程通,目前只会一种,采用信号槽机制。 通常情况下,信号和槽机制可以同步操作,这就意味着在发射信号的时候,使用直接函数即可以立刻调用连接到一个信号上的多个槽。然而,当连接位于不同线程中的对象时,这一机制就会变得不同步起来,可以通过修改QObject::connect()的第5个可选参数而改变。 con...

《好好先生》专栏 1204

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

使用 QT5 写 GUI 碰到的一些问题

开发环境 windows 10, Qt creator 4.10.0, curl, json 坑 curl 的 CURLOPT_URL,输入不能是std::string类,需要 .c_str()。 curl get 请求返回数据类型如果使用 QString,数据会偷工减料,随机丢几个字符很正常。 std::string 与 QString 之间有大坑!两者互相转换过程会随机乱码!如果碰到 debug/release 运行都乱码,但 debug 单步执行正常,可以添加 QTextCodec::setCode

not_a_id的博客 577

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Qt多线程[QMessageBox]Cannot set parent, new parent is in a different thread以及connect注意事项

Cannot set parent, new parent is in a different thread lamda表达式的注意事项 信号发出,槽函数不执行

猪在黑魔纹里 8938

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

多线程下的QT界面UI访问及槽函数的连接。

错误一:ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. 该错误是由于多线程直接访问非本线程创建的UI所导致的,我的解决办法(个人根据项目需要设定): 首先我声明了一个我需要操作的控件的全局指针,在这个控件在主线程初始化完成后,我让这个全局指针指向这个控件。我在该控件类自定义了signal和slots,构造函数中做了关...

${王小贱}的博客 2421

C0026.解决 QObject: Cannot create children for a parent that is in a different thread.

究其原因是因为 Qt 的每个对象都会有一个归属,产生这样的错误通过报错信息可以看得出,绑定的两个对象并非工作在同一线程里而导致(线程 ID 不同),即两个对象的所属不同。笔者的原本的报错代码中,是在线程类里面绑定父对象与当前对象的槽函数才导致出现这样的问题,即使临时解决的该问题,还会出现发送信号后槽函数不执行的情况。一般出现这样的错误是在 Qt 中使用多线程,并且尝试使用 connect 连接不同或同一对象的信号与槽函数而出现这样的问题。那么笔者另辟蹊径的并非完全采用网上各路大神给出的方案,而是。

u011023143的博客 1542

QT中线程调用GUI主线程控件的问题

QT中线程调用GUI主线程控件的问题之前写过一篇文章,是传界面指针到线程中去,从而在线程中操作主界面中控件。<br />今天发现,这种方法是极其错误的,文章我已经删掉,希望没有误人子弟。<br />前面转的两篇文章中对于为什么不能在线程中操纵界面控件指针有了很好的解释。下面在做下解释:<br />尽管QObject是可重入的,但GUI类,特别是QWidget与它的所有子类都是不可重入的。它们仅用于主线程。正如前面提到过 的,QCoreApplication::exec() 也必须从那个线程中被调用。实践上,

浪的专栏 1万+

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread 问题解决

将DataReceive构造函数中初始化upd的代码放到了doInit中,该函数被。使用Qt的多线程时,出现。started信号调用。

wjfdsklfdkfksd的博客 6155

c++,一个线程,对外提供一个槽函数,当这个槽函数被调用的时候,线程休眠一段时间

c++,一个线程,对外提供一个槽函数,当这个槽函数被调用的时候,线程休眠一段时间

xie__jin__cheng的博客 529
上一篇: poj 1013——用运算模拟变换操作
下一篇: qt-vs2010 手动添加新的qt类时,无法生成moc文件的解决
HelloElite
博客等级 码龄14年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值