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 ...
随机推荐
- 【Luogu】P1231教辅的组成(拆点+Dinic+当前弧优化)
题目链接 妈耶 我的图建反了两次 准确的说是有两个地方建反了,然后反上加反改了一个小时…… 知道为什么要拆点吗? 假设这是你的图 左边到右边依次是超级源点 练习册 书 答案 ...
- 【Openjudge】岛屿(并查集)
题目链接 此题是并查集.考虑到水位不断上涨,所以将时间倒转.先统计最后一天的联通块个数,每一天浮出水面的块进行计算.复杂度O(玄学). 代码如下 #include<cstdio> #inc ...
- OpenJ_Bailian3375
Farmer John has decided to reward his cows for their hard work by taking them on a tour of the big c ...
- 联合权值(codevs 3728)
Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v ...
- 【Codeforces Round #503 (Div. 2)】
A:https://www.cnblogs.com/myx12345/p/9843198.html B:https://www.cnblogs.com/myx12345/p/9843245.html ...
- J2ME开发入门
原文发布时间为:2008-07-31 -- 来源于本人的百度文章 [由搬家工具导入] J2ME开发入门J2ME方面开发的资料,确实是少之又少,一般给新手推荐的都是王森先生的《PDA与手机开发入门》一书 ...
- 使用 ftrace 调试 Linux 内核,第 3 部分
内核头文件 include/linux/kernel.h 中描述了 ftrace 提供的工具函数的原型,这些函数包括 trace_printk.tracing_on/tracing_off 等.本文通 ...
- 汉若塔系列续:汉诺塔VIII、汉诺塔IX、汉诺塔X。
汉诺塔VIII,在经典汉若塔问题上,问n个盘子的情况下,移动m次以后,是什么状态.(与第七代互为逆命题) 我的思路:本质还是dfs,但是用m的值来指引方向,每搜一层确定第i个盘子在哪个塔,o(n)的算 ...
- P1551 亲戚 洛谷
https://www.luogu.org/problem/show?pid=1551 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个 ...
- BUPT复试专题—哈夫曼编码(2009)
题目描述 哈夫曼编码中 平均码长=码长×码字出现的概率 如:ABCDE 五个字符的出现次数分别为50 20 5 10 15 那么,其哈夫曼编码为A:0 B:10 C:1110 D:111 ...