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操作了】

相关推荐
Felix_One1 天前
Qt 串口通信避坑指南:QSerialPort 的 5 个常见问题
qt
blasit4 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
范特西.i9 天前
QT聊天项目(8)
开发语言·qt
枫叶丹49 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
十五年专注C++开发10 天前
Qt deleteLater作用及源码分析
开发语言·c++·qt·qobject
kangzerun10 天前
SQLiteManager:一个优雅的Qt SQLite数据库操作类
数据库·qt·sqlite
金刚狼8810 天前
qt和qt creator的下载安装
开发语言·qt
追烽少年x10 天前
Qt中使用Zint库显示二维码
qt
谁刺我心10 天前
qt源码、qt在线安装器镜像下载
开发语言·qt
金刚狼8810 天前
在qt creator中创建helloworld程序并构建
开发语言·qt