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

相关推荐
代钦塔拉14 小时前
Qt QThread最标准Worker线程用法(零崩溃、零内存泄漏)
qt
神仙别闹16 小时前
基于QT(C++)+Sqlite3实现单词消除游戏系统
c++·qt·sqlite
熊孩纸的世界你不懂17 小时前
Qt + SQLite 配置与使用指南
c++·qt
我在人间贩卖青春18 小时前
重学Qt——串口编程
qt
sycmancia19 小时前
Qt——Qt中的调色板
开发语言·qt
我在人间贩卖青春19 小时前
重学Qt——多媒体
qt
yugi98783820 小时前
基于Qt的图像处理系统
开发语言·图像处理·qt
努力努力再努力wz1 天前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
奇树谦1 天前
QML 开发前端界面详解:从入门到示例实战
qt
我在人间贩卖青春1 天前
重学Qt——网络编程
qt