16,240
社区成员
发帖
与我相关
我的任务
分享
#include "NTcpThread.h"
#include <assert.h>
NTcpThread::NTcpThread(QObject *parent)
: QThread(parent),
pSock_(0
//new QTcpSocket
),
pendingRead_(false),
bytesToRead_(0), bytesReaded_(0), bufRead_(0),
pendingWrite_(false),
bytesToWrite_(0), bytesWritten_(0), bufWrite_(0)
{
//pSock_->moveToThread(this);
// connect(pSock_, SIGNAL(connected()), SIGNAL(onConnected())
// //,Qt::QueuedConnection
// );
// connect(pSock_, SIGNAL(disconnected()), SLOT(socketDisconnected())
// // ,Qt::QueuedConnection
// );
// connect(pSock_, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
// SLOT(socketStateChanged(QAbstractSocket::SocketState))
// //,Qt::QueuedConnection
// );
// connect(pSock_, SIGNAL(error(QAbstractSocket::SocketError)),
// SLOT(socketError(QAbstractSocket::SocketError))
// //,Qt::QueuedConnection
// );
// connect(pSock_, SIGNAL(readyRead()), SLOT(socketReadyRead())
// //,Qt::QueuedConnection
// );
// connect(pSock_, SIGNAL(bytesWritten(qint64)), SLOT(socketBytesWritten(qint64))
// //,Qt::QueuedConnection
// );
}
NTcpThread::~NTcpThread()
{
delete pSock_;
}
void NTcpThread::run()
{
qDebug()<<"NTcpThread::run() ,thread id is "<<currentThread()<<"\n";
QTcpSocket *pSock = new QTcpSocket;
connect(pSock, SIGNAL(connected()), SIGNAL(onConnected())
,Qt::QueuedConnection
);
connect(pSock, SIGNAL(disconnected()), SLOT(socketDisconnected())
// ,Qt::QueuedConnection
);
connect(pSock, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
SLOT(socketStateChanged(QAbstractSocket::SocketState))
//,Qt::QueuedConnection
);
connect(pSock, SIGNAL(error(QAbstractSocket::SocketError)),
SLOT(socketError(QAbstractSocket::SocketError))
//,Qt::QueuedConnection
);
connect(pSock, SIGNAL(readyRead()), SLOT(socketReadyRead())
//,Qt::QueuedConnection
);
connect(pSock, SIGNAL(bytesWritten(qint64)), SLOT(socketBytesWritten(qint64))
//,Qt::QueuedConnection
);
pSock_ = pSock;
initCond_.wakeOne();
//讲此函数设置成同步函数..
while(true){
QMutexLocker locker(&readLock_);
readCond_.wait(&readLock_);
pSock_->read(bufRead_,bytesToRead_);
emit onReadCompleted();
pendingRead_ = false;
bufRead_ = 0;
bytesToRead_ = 0;
// msleep(1);
}
qDebug()<<"NTcpThread::run()\n";
}
void NTcpThread::asyncConnect(const QString &hostName, quint16 port)
{
pSock_->connectToHost(hostName, port, QIODevice::ReadWrite);
}
bool NTcpThread::blockingConnect(const QString &hostName, quint16 port, int msecs)
{
QMutexLocker locker(&initLock_);
initCond_.wait(&initLock_);
pSock_->connectToHost(hostName, port, QIODevice::ReadWrite);
return pSock_->waitForConnected(msecs);
}
bool NTcpThread::pendingRead()
{
QMutexLocker lock(&pendingReadLock_);
return pendingRead_;
}
void NTcpThread::pendingRead(bool pending)
{
QMutexLocker lock(&pendingReadLock_);
pendingRead_ = pending;
}
void NTcpThread::asyncRead(quint64 bytesToRead, char *buf)
{
QMutexLocker locker(&readLock_);
bufRead_ = buf;
bytesToRead_ = bytesToRead;
pendingRead_ = true;
qDebug() << "NTcpThread::asyncRead, bytesAvailable()" << pSock_->bytesAvailable() << "bytesToRead_" << bytesToRead_;
if (pSock_->bytesAvailable() >= bytesToRead_)
readCond_.wakeAll();
}
//如果不使用线程处理,socketReadyRead在主线程中调用
void NTcpThread::socketReadyRead()
{
QMutexLocker locker(&readLock_);
qDebug() << "NTcpThread::socketReadyRead: " << pSock_->bytesAvailable();
if(pendingRead_)
if (pSock_->bytesAvailable() >= bytesToRead_)
readCond_.wakeAll();
}
void NTcpThread::asyncWrite(quint64 bytesToWrite, char const *buf)
{
assert( !pendingWrite_ );//上一个写请求未完成时,不能再写了
pendingWrite_ = true;
bytesWritten_ = 0;
bytesToWrite_ = bytesToWrite;
bufWrite_ = buf;
pSock_->write(buf, bytesToWrite);
pSock_->waitForBytesWritten();
if( bytesWritten_ == (quint64)-1 )
assert(0);
}
void NTcpThread::socketBytesWritten(qint64 bytesWritten)
{
qDebug() << "written " << bytesWritten << "bytes\n";
if( !pendingWrite_ )
return;
if( bytesWritten + bytesWritten_ == bytesToWrite_ )
{
pendingWrite_ = false;
bytesWritten_ = 0;
emit onWriteCompleted();
return;
}
bytesWritten_ += bytesWritten;
pSock_->write(bufWrite_ + bytesWritten_, bytesToWrite_ - bytesWritten_);
}
void NTcpThread::socketDisconnected()
{
}
void NTcpThread::socketError(QAbstractSocket::SocketError socketError)
{
qDebug()<<"NTcpThread::socketError "<<pSock_->errorString()<<"\n";
Q_UNUSED(socketError);
}
void NTcpThread::socketStateChanged(QAbstractSocket::SocketState socketState)
{
Q_UNUSED(socketState);
}