QT下QThread学习(二)
学习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学习(二)的更多相关文章
- Qt Model/View学习(二)
Model和View的搭配使用 DEMO pro文件 #------------------------------------------------- # # Project created by ...
- Docker下kafka学习三部曲之二:本地环境搭建
在上一章< Docker下kafka学习,三部曲之一:极速体验kafka>中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来 ...
- Qt下libusb-win32的使用(转)
源:Qt下libusb-win32的使用(一)打印设备描述符 主要是在前一篇的基础上,学习libusb-win32的API使用.程序很简单,就是打印指定USB设备的设备描述符(当然其他描述符也是可以的 ...
- Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good
目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...
- 【转】Qt下使用glut库
ps:这个说的很明白,尤其是win10环境下用mingw环境时编程时碰到的问题, 1.加 windows.h 2.在.pro 添加libs 博文地址:Qt下使用glut库 本人使用的环境 ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- Qt之QThread(深入理解)
简述 为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程.对于耗时操作如果不使用线程,UI界面将会长时间处于停滞状态,这种情况是用户非常不愿意看到的,我们可以用线程来解决这个问题. 前面,已 ...
- 解析Qt中QThread使用方法
本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...
随机推荐
- haskell 乱搞笔记[原创]
脑洞时间:为什么世界上有那么多程序语言,那是腐朽的资本主义为了增加广大人民学习成本以及编译原理太过普及造成的,建议大学取消编译原理的一切课程,并挥起奥姆休的剃刀,把所有程序语言统统踢了,除机器 ...
- Linux(7):用户管理
用户管理 让一个脚本或命令开机自启动的方法: # 方法一: 把脚本放到 /etc/rc.local 中 # 方法二: 把脚本或命令通过 chkconfig 管理 # 如何让一个脚本被 chkconfi ...
- 济南学习 Day 5 T3 pm
科普一下: φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数.φ(1)= ...
- Vue1.x 迁移 Vue2.x(项目进行不断修改)
一.$dispatch 和 $broadcast 已经被弃用. 请使用更多简明清晰的组件间通信和更好的状态管理方案,如:Vuex 这些方法的最常见用途之一是父子组件的相互通信.在这些情况下,你可以使用 ...
- ROS节点分布式运行方法
一. 主机Master设置 1.安装ssh客服端和服务器(ubuntu已默认安装了) 2.机器名与ip绑定 由于/etc/hosts中需要将计算机名和IP绑定,所有最好设置IP地址为静态地址 sudo ...
- Linux线上系统程序debug思路及方法
http://blog.csdn.net/wangzuxi/article/details/44766221
- 高级算法设计讲义 Lecture Notes for Advanced Algorithm Design
(Last modification: 2012-12-17) Textbooks: (1) David Williamson, David Shmoys. The Design of Approxi ...
- iOS App 项目:会员卡管理系统设计方案
1.需求描写叙述 店主须要管理自己的会员信息和充值卡信息以及消费纪录 店主觉得购买电脑和外设成本太高,并且店面没有地方容纳这些设备 店主希望通过手机来完毕这些功能.但尽量不产生流量.对网络要求较低 店 ...
- 最近遇到的C++数字和字符串的转换问题
1. 用itoa 和atoi 在头文件#include<cstidlib> itoa用法: char * itoa ( int value, char * str, int base ) ...
- Windows-速度优化的几个方面
One. Win+R - > cmd- > msconfig 禁用不需要的启动项! Two. 关闭一些视觉选项 Three. 设置应用启动快捷键