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

相关推荐
追风赶月、10 小时前
【QT】事件(鼠标、按键、定时器、窗口)
qt
牵牛老人13 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
-凌凌漆-17 小时前
【Qt】QStringLiteral 介绍
开发语言·qt
想要入门的程序猿17 小时前
Qt写入excel
数据库·qt·excel
丁劲犇18 小时前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
charlie11451419119 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
醇醛酸醚酮酯21 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
Mr_Xuhhh1 天前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
灵性花火1 天前
Qt的前端和后端过于耦合(0/7)
开发语言·前端·qt
菜鸟看点1 天前
自定义Cereal XML输出容器节点
c++·qt