QT 多线程和 QSocket 网络编程实例解析

本文介绍的是QT 多线程QSocket 网络编程实例解析,要实现网络编程,不说这么多,先来看内容。

(1)带后缀-mt的库才是支持多线程的.

例如windows下面的qt-mt320.lib,其他平台libqt-mt

(2)编译问题,要添加QT_THREAD_SUPPORT

(30针对线程里面而言,blocking(阻塞的) = synchronous(同步的 )

non-blocking (非阻塞的) = asynchronous(异步的 )

Qt的signal/slot的事件机制都是基于主程序的线程的,因此所有的事件都是阻塞型的(blocking),也就是说除非你处理完某个slot事件,不然不会有下个事件被触发。

(4)QSocket,QSocketNotifier不能和QThread一起使用

  1. QSocketisfornon-blockingIO,itusessomepollinglikepoll()orselect()internallyandnotifiestheactualcodebyemittingsignals.
  2. SoQSocketisforusewithonlytheeventloopthread,forexampleinaclientwithonlyonesocketoraserverwithveryfewconnections.
  3. IfyouwantathreadedapproachuseQThreadandQSocketDevice.
  4. PutoneSocketDeviceintolisteningmodeandonaccept()createaHandlerThreadforthesocketfiledescriptor.
  5. UsethesecondQSocketDeviceconstructortoinitialisetheConnection’ssocketdeviceinstance.
  6. Theserverdoes
  7. bind()
  8. listen()
  9. and
  10. accept()
  11. Whenacceptreturnsithasthefiledescriptoroftheconnection’ssocketwhichyoucanpasstoanotherQSocketDeviceconstructor.
  12. Theclientdoesconnect()toestablishtheconnection.
  13. BothusereadBlock/writeBlock/waitForMoretotransferdata

.

一个例子:

(1)用VC6.0新建个Win32 Console Application工程

(2)Project Settings里面Link标签页面添加qtmain.lib qt-mt320.lib

Project Settings里面C/C++标签页面添加QT_THREAD_SUPPORT

(3)源代码文件(main.cpp):

  1. #include<qthread.h>
  2. classMyThread:publicQThread
  3. {
  4. public:
  5. virtualvoidrun();
  6. };
  7. voidMyThread::run()
  8. {
  9. for(intcount=0;count<20;count++)
  10. {
  11. sleep(1);
  12. qDebug(“Ping!”);
  13. }
  14. }
  15. intmain()
  16. {
  17. MyThreada;
  18. MyThreadb;
  19. a.start();
  20. b.start();
  21. a.wait();
  22. b.wait();
  23. }

注释:

This will start two threads, each of which writes Ping! 20 times to the screen and exits.

The wait() calls at the end of main() are necessary because exiting main() ends the program,

unceremoniously killing all other threads.

Each MyThread stops executing when it reaches the end of MyThread::run(),

just as an application does when it leaves main().

小结:关于QT 多线程QSocket 网络编程实例解析的内容介绍到这,希望本文对你有所帮助。

【编辑推

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源设置1个资源分,您可以下载作为捐献。 如果您有Git,还可以从http://www.goldenhawking.org:3000/goldenhawking/zoom.pipeline直接签出最新版本 (上一个版本“一种可伸缩的全异步C/S架构服务器实现”是有问题的,现在已经完成更改)。 服务由以下几个模块组成. 1、 网络传输模块。负责管理用于监听、传输的套接字,并控制数据流在不同线程中流动。数据收发由一定规模的线程池负责,实现方法完全得益于Qt的线程事件循环。被绑定到某个Qthread上的Qobject对象,其信号-槽事件循环由该线程负责。这样,便可方便的指定某个套接字对象使用的线程。同样,受惠于Qt的良好封装,直接支持Tcp套接字及SSL套接字,且在运行时可动态调整。(注:编译这个模块需要Qt的SSL支持,即在 configure 时加入 -openssl 选项) 2、 任务流水线模块。负责数据的处理。在计算密集型的应用中,数据处理负荷较重,需要和网络传输划分开。基于普通线程池的处理模式,也存在队列阻塞的问题——若干个客户端请求的耗时操作,阻塞了其他客户端的响应,哪怕其他客户端的请求很短时间就能处理完毕,也必须排队等待。采用流水线线程池避免了这个问题。每个客户端把需要做的操作进行粒度化,在一个环形的队列中,线程池对单个客户端,每次仅处理一个粒度单位的任务。单个粒度单位完成后,该客户端的剩余任务便被重新插入到队列尾部。这个机制保证了客户端的整体延迟较小。 3、 服务集群管理模块。该模块使用了网络传输模块、任务流水线模块的功能,实现了跨进程的服务器ßà服务器链路。在高速局域网中,连接是快速、稳定的。因此,该模块被设计成一种星型无中心网络。任意新增服务器节点选择现有服务器集群中的任意一个节点,接入后,通过广播自动与其他服务器节点建立点对点连接。本模块只是提供一个服务器到服务器的通信隧道,不负责具体通信内容的解译。对传输内容的控制,由具体应用决定。 4、 数据库管理模块。该模块基于Qt的插件式数据库封装QtSql。数据库被作为资源管理,支持在多线程的条件下,使用数据库资源。 5、 框架界面。尽管常见的服务运行时表现为一个后台进程,但为了更好的演示服务器的功能,避免繁琐的配置,还是需要一个图形界面来显示状态、设置参数。本范例中,界面负责轮训服务器的各个状态,并设置参数。设置好的参数被存储在一个ini文件中,并在服务开启时加载。 6、应用专有部分模块。上述1-4共四个主要模块均是通用的。他们互相之间没有形成联系,仅仅是作为一种资源存在于程序的运行时(Runtime)之中。应用专有部分模块根据具体任务需求,灵活的使用上述资源,以实现功能。在范例代码中,实现了一种点对点的转发机制。演示者虚拟出一些工业设备,以及一些操作员使用的客户端软件。设备与客户端软件在成功认证并登录后,需要交换数据。改变这个模块的代码,即可实现自己的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值