QT跨线程的信号与槽[2]---后台SOCKET
来源:互联网 发布:怎么做图书marc数据 编辑:程序博客网 时间:2024/05/01 06:48
继上一篇文章
大体实现了一个与UI线程分离的SOCKET封装类
即后台线程负责收发数据包,有数据到来则通知UI线程
UI线程发送数据时通知后台线程(异步)
嗯,大概是这个意思
#pragma once#include <QTcpSocket>#include <QByteArray>#include "XBackgroundWorker.h"class CXAsyncSocket : public CXBackgroundWorker{Q_OBJECTpublic:explicit CXAsyncSocket(void);virtual ~CXAsyncSocket(void);private:QTcpSocket *m_TcpSocket;private slots:void Construct_Invokee();void Destruct_Invokee();void Connect_Invokee(char *host, quint16 port);void DisConnect_Invokee();void Send_Invokee(QByteArray buffer);public:static void RegisterMetaTypes();// 下面三个函数用于前台线程void Connect(char *host, quint16 port);void DisConnect();void Send(QByteArray buffer);private slots:// 执行环境为后台线程void OnReceive();protected:// 执行环境为后台线程virtual void OnReceiveBuffer(QByteArray &buffer) = 0;signals:void OnConnect();void OnDisConnect();void OnException(QAbstractSocket::SocketError);};
#include "XAsyncSocket.h"CXAsyncSocket::CXAsyncSocket(){m_TcpSocket = NULL;QMetaObject::invokeMethod(this, "Construct_Invokee", Qt::BlockingQueuedConnection);Q_ASSERT(m_TcpSocket != NULL);}CXAsyncSocket::~CXAsyncSocket(void){Q_ASSERT(m_TcpSocket != NULL);QMetaObject::invokeMethod(this, "Destruct_Invokee", Qt::BlockingQueuedConnection);Q_ASSERT(m_TcpSocket == NULL);}void CXAsyncSocket::RegisterMetaTypes(){qRegisterMetaType<char*>("char*");qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");}void CXAsyncSocket::Construct_Invokee(){m_TcpSocket = new QTcpSocket;connect(m_TcpSocket, SIGNAL(connected()), this, SIGNAL(OnConnect()), Qt::QueuedConnection);connect(m_TcpSocket, SIGNAL(disconnected()), this, SIGNAL(OnDisConnect()), Qt::QueuedConnection);connect(m_TcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SIGNAL(OnException(QAbstractSocket::SocketError)), Qt::QueuedConnection);connect(m_TcpSocket, SIGNAL(readyRead()), this, SLOT(OnReceive()), Qt::QueuedConnection);}void CXAsyncSocket::Destruct_Invokee(){m_TcpSocket->disconnect();m_TcpSocket->abort();delete m_TcpSocket;m_TcpSocket = NULL;}void CXAsyncSocket::Connect_Invokee(char *host, quint16 port){m_TcpSocket->connectToHost(host, port);}void CXAsyncSocket::Connect(char *host, quint16 port){QMetaObject::invokeMethod(this, "Connect_Invokee", Qt::QueuedConnection, Q_ARG(char*, host), Q_ARG(quint16, port));}void CXAsyncSocket::DisConnect_Invokee(){m_TcpSocket->abort();}void CXAsyncSocket::DisConnect(){QMetaObject::invokeMethod(this, "DisConnect_Invokee", Qt::QueuedConnection);}void CXAsyncSocket::Send_Invokee(QByteArray buffer){m_TcpSocket->write(buffer);}void CXAsyncSocket::Send(QByteArray buffer){QMetaObject::invokeMethod(this, "Send_Invokee", Qt::QueuedConnection, Q_ARG(QByteArray, buffer));}void CXAsyncSocket::OnReceive(){OnReceiveBuffer(m_TcpSocket->readAll());}
0 0
- QT跨线程的信号与槽[2]---后台SOCKET
- QT跨线程的信号与槽
- QT信号槽的跨线程连接
- Qt线程间的信号与槽 以及 QThread
- QT子线程与主线程的信号槽通信
- QT子线程与主线程的信号槽通信
- QT子线程与主线程的信号槽通信
- QT子线程与主线程的信号槽通信
- QT子线程与主线程的信号槽通信
- Qt线程---链接信号与槽的connect
- QT子线程与主线程的信号槽通信
- Qt线程间的信号与槽 以及 QThread
- QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽
- Qt 的信号与槽
- 跨线程的信号与槽
- Qt跨线程信号和槽的连接
- Qt跨线程信号和槽的连接
- QT 跨线程信号的注册
- springmvc学习笔记(八)json传递数据
- 例说linux内核与应用数据通信(一):添加一个系统调用
- Android性能调优工具TraceView介绍
- 文章标题
- javascript-jquery插件--FlexGrid 用法参数
- QT跨线程的信号与槽[2]---后台SOCKET
- UVAoj 11178Morley's Theorem
- mysql 数据表的基本操作
- cdev_init和cdev_add之后在/dev目录下没有长出设备节点原因
- Android内存监测工具DDMS->Heap,内存分析工具->MAT
- XtraBackup 实现不停机不锁表搭建mysql主从
- 深入理解Java注解(2):高级应用
- POJ 1423.Big Number
- FZU 2177 动态规划