Qt中采用多线程实现Socket编程

Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

本文介绍的是Qt中采用多线程Socket编程,由于工作的需要,开始接触Qt的socket编程。Qt里的example是个不错的教程,但是当我把代码移植到多线程的环境时就出问题了:

QObject: Cannot create children for a parent that is in a different thread.

由于想要在线程中保留一个socket,以便维持双边通信,因此定义如下:

SocketThread:public QThread

{

....

private:

QTcpSocket _tcpSocket;

}

但是这段代码并无法正常的完成工作,后来在网上搜了一下资料,找到以下解释:“在QThread中定义的所有东西都属于创建该QThread的线程。“

问题出来了,如果按照这个定义,在SocketThread中定义的_tcpSocket,其实是属于mainThread(SocketThread是在main函数中创建),而当我们在SocketThread中的run函数使用到_tcpSocket的时候,其实是跨线程调用,这样就会出现上面的异常。

解决方法: 需要对SocketThread的定义做一下更改:

SocketThread:public QThread

{

....

private:

QTcpSocket* _tcpSocket;

}

在上面我们并没有创建具体的对象,而是定义了一个指针,而如何让指针内的内容从属于SocketThread这个线程呢?答案就是要在SocketThread的run方法中初始化:

SocketThread::run()

... ;

_tcpSocket = new QTcpSocket();

进行以上修改之后上面的异常就不再出现了。

小结:Qt中采用多线程Socket编程的内容介绍完了,在编程过程中我们也不免接触多线程,相信也有一定的了解,最后希望本文对你有所了解!

在使用Qt线程时,在线程里跑上一个定时器。定时器时间超限时触发信号,传递给主线程做其他的事情。

继承QThread后在实现run()函数后,m_pTimer = new QTimer(this);   new一个定时器对象,并传入this指针---注意此时的this指针是主线程的。但每次创建线程时会出现以下提示:

QObject: Cannot create children for a parent that is in a different thread

传入this指针------相当于在子线程里为主线程建立了对象,所以出现跨线程警告。

另外QT中继承Qthread类后,在类中定义的对象或或对象的指针都是属于主线程的。次线程正真意义上的实体内容实在实现run()函数里。

所以,要将mythread线程里的对象或指针创建,需要在run()函数里,创建或分配对象空间。

Qt中采用多线程实现Socket编程相关推荐

  1. 在QT中采用多线程下载文件

    在QT中采用多线程下载文件 这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的, ...

  2. Qt中使用多线程并返回结果到主线程的例子

    Qt中使用多线程是通过connect关联信号和槽来实现子线程与主线程之间的数据传递与页面数据展示的,详细请看下面实例: 下面三行代码是实现主线程与子线程通信的信号连接. //子线程运行了RUN()中的 ...

  3. QT 中的多线程之 moveToThread

    文章目录 1. 概述 2. 方法描述 3. 代码: 4. 运行结果 5. 注意事项 6. 结语 1. 概述 在 Qt 中,多线程也被广泛用于实现后台任务.异步操作.多任务处理等功能.通过使用多线程,可 ...

  4. Python 中最全面的 Socket 编程指南

    (点击上方公众号,可快速关注一起学Python) 翻译:  keelii   链接: https://keelii.com/2018/09/24/socket-programming-in-pytho ...

  5. 多线程Java Socket编程示例(转)

    这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送 ...

  6. 多线程下SOCKET编程

    SOCKET编程往往离不开多线程,说到多线程,总的说来还是一个比较复杂的东西,尤其是业务逻辑变得复杂的时候,有时候或者说经常,会弄得人头晕脑胀.但是C#,相对好一点,因为微软封装了,帮我们做很多工作, ...

  7. Qt中使用多线程的一些心得(一)——继承QThread的多线程使用方法

    一 前言 二Qt多线程方法一 继承QThread 2.1使用多线程的原因分析 2.2 写一个继承于QThread的线程 三 总结 一 前言   本篇文章部分内容参考了该博文:传送门.   Qt中有两种 ...

  8. QT每日一练day29:QT中的多线程探究

    一.未使用多线程,则w0先运行完后,w1才开始运行 运行结果(GIF动图): main.cpp xiaowen_QT_day29.pro QT+=widgets SOURCES += \main.cp ...

  9. 多线程Java Socket编程示例

    采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 1.服务端 package sterning; import java.io.B ...

最新文章

  1. Delphi之对象库(Object Repository)
  2. Python-time标准库知识小结
  3. 概述---《TCP/IP协议》卷一 练习题
  4. 移动APP接口安全性设计
  5. 1014 福尔摩斯的约会 (20分)
  6. linux twm,linux 命令缩写解析
  7. 视频AI,助力体育赛事转播走进智能时代
  8. 图像分类 数据准备(将文件夹中所有图片路径写到TXT文件中)
  9. CentOS 安装JDK跟TOMCAT
  10. re.containerbase.startinternal 子容器启动失败_微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)...
  11. leetcode 96. 不同的二叉搜索树(Unique Binary Search Trees)
  12. Delphi通过管道执行外部命令行程序(cmd)并获取返回结果
  13. vue3.0项目创建
  14. ubuntu mysql远程连接
  15. python架构师是做什么的_架构师的工作都干些什么?!想做架构师必看!
  16. matlab中si是什么意思,Sitsang是什么意思
  17. ICPC World Finals 2015 D题 - Cutting Cheese 【二分答案】【球缺体积公式】
  18. Python-《原神》荒海雷立方机关破解二
  19. 菜鸟学算法--二分查找
  20. vivo手机便签app下载,vivo自带便签软件下载

热门文章

  1. 通俗易懂RESTful,如何设计RESTful风格API
  2. Buffer.concat()
  3. 基于Redis+Kafka的首页曝光过滤方案
  4. ABP中使用Redis Cache(1)
  5. 【MVC5】对MySql数据库使用EntityFramework
  6. CountDownLatch和Semaphore使用场景
  7. hadoop入门学习教程--DKHadoop完整安装步骤
  8. swift 点击imageView全屏预览(UIview中弹出提示框)
  9. zabbix3.x添加H3C网络设备详解
  10. Python3笔记——IDE的选择