QTcpSocket 对象的可工作线程

2024-01-22 08:52

本文主要是介绍QTcpSocket 对象的可工作线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QTcpSocket 对象的可工作线程:
QTcpSocket 对象创建成功,并设置好底层socket描述符后;在qt中只能在一个线程中工作【即收发网络数据】这个线程就是创建这个QTcpSocket对象的线程,原理上这就与这个对象依附线程是同一个线程;但是注意的是使用 movetothread 可以改变对象的依附线程;但是这个QTcpSocket的对象的可工作线程不会因此而改变【qt的细节不做深究】

QTcpServer::incomingConnection函数的行为:
当有socket链接并成功可用时,其实首先调用的是incomingConnection虚函数;默认实现是在其中创建QTcpSocket并调用SocketDescriptor设置其底层socket描述符;然后讲这个创建的QTcpSocket对象添加到内部维护的list链表中,使其参与qt链接机制;最后emit newConnection信号;后面在其处理函数中调用的QTcpServer::nextPendingConnection返回的就是这个list中保存的对象;=>可知默认行为这个QTcpSocket对象的可工作线程应该是调用incomingConnection函数的线程,而这个函数是被qt框架调用;理论上应该也是QTcpServer对象的所依附线程【可以认为是GUI线程】=>这样这个QTcpSocket对象就不能被其他子线程使用了;【详见qt文档】

重新实现此函数以在连接可用时更改服务器的行为。
如果此服务器使用的是QNetworkProxy,则socketDescriptor可能无法与本机套接字函数一起使用,而应仅与QTcpSocket::setSocketDescriptor()一起使用。【即此时socketDescriptort并不是真正的底层socket无法被本机套接字API使用,只能被封装为QTcpSocket对象使用】

重写注意点:
1.如果在此方法的重新实现中创建了另一个套接字,则需要通过调用addPendingConnection()将其添加到挂起的连接机制中。【这种方法增加了QTcpSocket的子类灵活性,但是对象还是只能在GUI线程中工作】

2.如果希望将传入的连接作为另一个线程中的新QTcpSocket对象处理,则必须将socketDescriptor传递给另一个线程,并在那里创建QTcpSocket对象并使用其setSocketDescriptor()方法。【即重写实现里面只需要把socketDescriptor信息转发给另一个线程】【真正创建QTcpSocket对象的操作在另一个线程里面完成并设置底层socketDescriptor;就可以在另一个线程里面利用这个QTcpSocket对象进行网络IO操作了】

这篇关于QTcpSocket 对象的可工作线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/632481

相关文章

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu