学习QThread主要是为了仿照VC下的FTP服务器写个QT版本。不多说,上图。

  

  FTP服务器的软件结构在上面的分析中就已经解释了,今天要解决的就是让每一个客户端的处理过程都可以按一个线程来单独跑。先给出上面3个类的cpp文件,再给出现象。

  1、QListenSocket类

 #include "qlistensocket.h"
#include <QTcpSocket>
#include <QDebug> QListenSocket::QListenSocket(QObject *parent,int port):QTcpServer(parent)
{
listen(QHostAddress::LocalHost,port);
} void QListenSocket::incomingConnection(int socketDescriptor)
{
qDebug()<<"A new Client Connnected!"; QControlThread *tmp =new QControlThread(socketDescriptor,this);
ClientList.append(tmp); tmp->start();
}

  2、QControlThread类

 //线程构造函数
QControlThread::QControlThread(qintptr socketDescriptor,QObject *parent):QThread(parent)
{
qDebug()<<"QControlThread Construct Function threadid:"<<QThread::currentThreadId(); m_ControlSocketObj = new QControlSocketObj(socketDescriptor,); m_ControlSocketObj->moveToThread(this); //将m_ControlSocketObj和它的槽函数都移到本线程中来处理
} QControlThread::~QControlThread()
{
delete m_ControlSocketObj; quit();
wait();
deleteLater();
}

  3、QControlSocketObj类

 #include "qcontrolsocketobj.h"
#include <QDebug>
#include <QThread> QControlSocketObj::QControlSocketObj(qintptr socketDescriptor,QObject *parent) : QObject(parent)
{
m_ControlSocket = new QTcpSocket;
m_ControlSocket->setSocketDescriptor(socketDescriptor); connect(m_ControlSocket,SIGNAL(readyRead()),this,SLOT(dataReceived())); qDebug()<<"QControlSocketObj Construct Function threadid:"<<QThread::currentThreadId();
} void QControlSocketObj::dataReceived()
{
qDebug()<<"QControlSocketObj dataReceived Function threadid:"<<QThread::currentThreadId();
}

  显示结果如下:

  这是连接的客户端,连接了2个tcp客户端,连接上了以后,给服务器随便发送了些文字。

  

  2、应用程序输出结果。

  

  基本想法达到了,还是有几个地方值得注意。QControlThread的构造函数执行在主线程中,QControlSocketObj的构造函数也执行在主线程中。

  QObject::MoveToThread的官方说明是:

  Changes the thread affinity for this object and its children. The object cannot be moved if it has a parent. Event processing will continue in the targetThread.

  QControlThread对象和QControlSocketObj对象都是在QListenSocket类中被构造的,所以他们的构造函数会在主线程中被执行。

  QThread所表示的线程是其成员函数Run执行的代码。run的默认处理就是做消息的接收与处理。

QT下QThread学习(二)的更多相关文章

  1. Qt Model/View学习(二)

    Model和View的搭配使用 DEMO pro文件 #------------------------------------------------- # # Project created by ...

  2. Docker下kafka学习三部曲之二:本地环境搭建

    在上一章< Docker下kafka学习,三部曲之一:极速体验kafka>中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来 ...

  3. Qt下libusb-win32的使用(转)

    源:Qt下libusb-win32的使用(一)打印设备描述符 主要是在前一篇的基础上,学习libusb-win32的API使用.程序很简单,就是打印指定USB设备的设备描述符(当然其他描述符也是可以的 ...

  4. Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  5. 【转】Qt下使用glut库

    ps:这个说的很明白,尤其是win10环境下用mingw环境时编程时碰到的问题, 1.加 windows.h 2.在.pro 添加libs     博文地址:Qt下使用glut库   本人使用的环境 ...

  6. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  7. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  8. Qt之QThread(深入理解)

    简述 为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程.对于耗时操作如果不使用线程,UI界面将会长时间处于停滞状态,这种情况是用户非常不愿意看到的,我们可以用线程来解决这个问题. 前面,已 ...

  9. 解析Qt中QThread使用方法

    本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...

随机推荐

  1. 洛谷P4094 - [TJOI2016]字符串

    Portal Description 给出一个字符串\(s(|s|\leq10^5)\)和\(m\)次询问,每次询问子串\(s[x_1..x_2]\)的所有子串和\(s[y_1..y_2]\)的最长公 ...

  2. bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2446  Solved: 770[Submit][Statu ...

  3. angular中的this指向问题

    this是指向当前$scope的. 例如在ng-click的使用中,this是指向当前的$scope而并不是dom元素的. 我们可以使用this的一些方法和属性 我们打印一下this就会发现,this ...

  4. cobbler api接口开发测试实例

    条件1:必须搭建好cobbler服务,并且可以通过web访问:http://cobbler_ip/cobbler_web 测试可以打开.然后再用以下命令测试. #!/opt/python3/bin/p ...

  5. numpy数组之读写文件

    目录 通过 numpy 读写 txt 或 csv 文件 通过 numpy 读写 npy 或 npz 文件 读写 npy 文件 读写 npz 文件 通过 h5py 读写 hdf5 文件 简单读取 通过切 ...

  6. 单片机C51串口发送、接收寄存器

    所以,发送和接收寄存器可使用同一地址,编写验证程序(发送和接收是独立空间):读取一个数(1)->发送一个数(2)->再读取得1则是独立空间 不知道STM32串口寄存器和C51串口寄存器是否 ...

  7. 迈出从3K到1W的重要一步——掌握设计模式

    IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝:而自己加班加点搞到天亮还做不完. 为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置:而自 ...

  8. Activiti Model Editor组件

    通过Activiti Modeler架构图可知,Activiti Explorer采用的是Vaadin框架. Vaadin 是一种 Java Web 应用程序的开发框架, 其设计目标是便利地创建和维护 ...

  9. C# UserControl 判断是否是设计模式中

    In Windows Forms application, we can use Control.IsInDesignMode or LicenseManager.UsageMode == Licen ...

  10. python异常捕获异常堆栈输出

    python异常捕获异常堆栈输出 学习了:https://blog.csdn.net/chris_grass/article/details/77927902 import traceback def ...