qtcpsocket多线程_qtcpsocket接收数据

qtcpsocket多线程_qtcpsocket接收数据简述最近在写有关网络传输的项目,使用了Qt封装的QTcpSocket,但是发现很多的跨线程导致死机的问题,也许是我了解的不够深入吧。最开始是自己继承一个线程然后把套接字传递到线程使用遇到程序崩溃;否决后使用了QObject::moveToThread()的方式,虽然程序可以正常发送接收数据但是对于QTcpSocket(moveToThread后属于子线程)与主线程的交互并不是很友好,还是存在一些问题;最后是考虑到了QTcpSocket跨线程崩溃说明它本身内置了一些发送或者接收的线程,这样…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

简述

        最近在写有关网络传输的项目,使用了Qt封装的QTcpSocket,但是发现很多的跨线程导致死机的问题,也许是我了解的不够深入吧。最开始是自己继承一个线程然后把主线程创建的套接字传递到子线程并且在子线程中写入数据遇到程序崩溃;否决后是考虑到了跨线程访问的问题,QTcpSocket跨线程崩溃说明它只能是在哪个线程创建就只能在哪个线程使用,这样想的话只需要把特别耗时的处理(数据准备操作)放到一个子线程中,然后把待写入数据通过信号槽的形式传递给QTcpSocket所在线程(其实就是主线程)中然后调用QTcpSocket::write()发送,但是这就让主线程在写数据了,如果数据不是很大倒也可以,看个人情况而定;最后决定使用QObject::moveToThread()的方式,因为我要不间断的发送大量的数据所以在一个子线程中操作才是明智的选择,就是把在主线程创建好的QTcpSocket对象通过QObject::moveToThread()放到一个子线程中操作(也就相当于是在子线程创建的),后续的QTcpSocket与主线程之间的操作都是通过信号槽形式进行的。

测试

        使用QObject::moveToThread()的测试样例:

qtcpsocket多线程_qtcpsocket接收数据

方式一:子线程通过信号槽形式让主线程去写

        点击连接时把各种信号槽关联上:

void MainWnd::on_pbConnect_clicked()
{
    // 客户端开始连接
    m_Socket.connectToHost(QH
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195590.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月14日 上午11:22
下一篇 2025年10月14日 下午12:01


相关推荐

  • java 登陆拦截器_java 登录拦截器

    java 登陆拦截器_java 登录拦截器首先创建一个FilterServlet类下面代码packagecom.group.users.util;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.Se…

    2022年6月3日
    37
  • Python转义字符及用法

    Python转义字符及用法在 Python 字符串 一节中我们曾提到过转义字符 就是那些以反斜杠 开头的字符 ASCII 编码为每个字符都分配了唯一的编号 称为编码值 在 nbsp Python nbsp 中 一个 ASCII 字符除了可以用它的实体 也就是真正的字符 表示 还可以用它的编码值表示 这种使用编码值来间接地表示字符的方式称为转义字符 EscapeCharac 如果你对 ASCII 编码不了解 请猛击 ASCII 编码 将英文存储到计算机 ASCII 码一览表 ASCII 码对照表 完整版

    2026年3月17日
    2
  • users的权限_user是啥

    users的权限_user是啥MySQL在安装时会自动创建一个名为mysql的数据库,mysql数据库中存储的都是用户权限表。用户登录以后,MySQL会根据这些权限表的内容为每个用户赋予相应的权限。user表是MySQL中最重要的一个权限表,用来记录允许连接到服务器的账号信息。需要注意的是,在user表里启用的所有权限都是全局级的,适用于所有数据库。user表中的字段大致可以分为4类,分别是用户列、权限列、安全列、资源控制列,下面主要介绍这些字段的含义。用户列用户列存储了用户连接MySQL

    2026年4月18日
    3
  • java 检查bytebuf长度_ByteBuf分析

    java 检查bytebuf长度_ByteBuf分析1 概念 JavaNIOAPI 自带的缓冲区类功能相当有限 没有经过优化 使用 JDK 的 ByteBuffer 操作更复杂 故而 Netty 的作者 TrustinLee 为了实现高效率的网络传输 重新造轮子 Netty 中的 ByteBuf 实际上就相当于 JDK 中的 ByteBuffer 其作用是在 Netty 中通过 Channel 传输数据 2 优势可以自定义缓冲类型 通过内置的复合缓冲类型 实现透明的零拷贝 ze

    2026年3月19日
    2
  • Eclipse SVN 安装注意事项[通俗易懂]

    Eclipse SVN 安装注意事项

    2022年1月17日
    47
  • UDP协议解析

    UDP协议解析????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????????‍????UDP协议简介UDP是UserDatagramProtocol的简称,中文名是用户数据报协议,是OSI(OpenSystemInt

    2022年6月7日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号