| 
UID:116608
注册时间2011-05-10最后登录2014-04-28在线时间30小时
发帖13搜Ta的帖子精华0
金钱150威望23贡献值0好评度13
访问TA的空间加好友用道具
     | 
 
RT 请高手指教-谢谢帮忙! 我自己参照网上的一些资料写了个QTcpSocket的线程!当我连接到服务器后,然后让服务器断开连接,程序有时候就正常,但是大多数情况下程序就崩溃!错误 信息如下图:   就是d这个参数有问题 !     if (d->socketEngine)         d->socketEngine->setReadNotificationEnabled(false); 执行 完这句就挂了!!   我尝试过用Designer进行编译 ,MinGw进行编译,并且今天我还更新了新的QT4 .8.1(以前是4.8.0),都是崩溃,一会儿就好了! 我把链接socket状态信号和自定义槽,注释掉后,就留下发射数据 的信号,就没有 任何问题!如下: //connect(socketClient, SIGNAL(connected()),this, SLOT(sendRequest())); //connect(socketClient, SIGNAL(disconnected()), this,SLOT(connectionCloseByServer())); connect(socketClient, SIGNAL(readyRead()), this, SLOT(recvdatagram()),Qt::DirectConnection); //connect(socketClient, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error())); 
 所以我怀疑我的代码写的有问题,请各位高手指点!! 贴源码: SocketThread.h #ifndef SOCKETTHREAD #define SOCKETTHREAD #include <QtNetwork/QtNetwork> #include <QThread> class SocketThread : public QThread { Q_OBJECT //function public: SocketThread(QHostAddress addr, int port); ~SocketThread(); //通过该函数删除socket void Stop(); // variable public: //variable private: int sum; bool needStopThread; QTcpSocket *socketClient; quint16 readBufferSize; quint16 nextBlockSize; QByteArray datagram; QHostAddress _hostAddress; int _portNumber; //function private: void closeConnection(); private slots: void sendRequest(); void connectionCloseByServer(); void error(); void recvdatagram(); signals: //将接收到的数据和状态发射出去! void RecvDateDisplay(QByteArray str); void SumDisplay(int s); void disButtonDisplay(bool b); void conButtonDisplay(bool a); void proBarDisplay(bool a); void staLabeDisplay(QString str); protected: virtual void run(); }; #endif //SOCKETTHREAD
SocketThread.cpp #include "SocketThread.h" #include <QtGui> SocketThread::SocketThread(QHostAddress addr, int port) { _hostAddress =addr; _portNumber = port; sum = 0; needStopThread = false; socketClient=NULL; readBufferSize = 256; qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError"); } SocketThread::~SocketThread() { needStopThread = false; closeConnection(); quit(); wait(); } void SocketThread::sendRequest() { emit staLabeDisplay(tr("Connected!")); emit proBarDisplay(false); } void SocketThread::connectionCloseByServer() { if (nextBlockSize != 0xFFFF) { emit staLabeDisplay(tr("Error:connection closed by server")); emit proBarDisplay(false); } if (socketClient) { socketClient->close(); exit(); wait(); } } void SocketThread::error() { emit staLabeDisplay(socketClient->errorString()); emit proBarDisplay(false); emit conButtonDisplay(true); emit disButtonDisplay(false); if (socketClient) { socketClient->close(); exit(); wait(); } } void SocketThread::run() { nextBlockSize = 0; socketClient = new QTcpSocket; if (!_hostAddress.isNull() && _portNumber >0) { socketClient->abort(); socketClient->connectToHost(_hostAddress, _portNumber, QIODevice::ReadOnly); socketClient->setReadBufferSize(readBufferSize); emit staLabeDisplay(tr("Connect to Server........")); emit proBarDisplay(true); emit conButtonDisplay(false); emit disButtonDisplay(true); } //slot connect(socketClient, SIGNAL(connected()),this, SLOT(sendRequest())); connect(socketClient, SIGNAL(disconnected()), this,SLOT(connectionCloseByServer())); connect(socketClient, SIGNAL(readyRead()), this, SLOT(recvdatagram()),Qt::DirectConnection); connect(socketClient, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error())); exec(); while(needStopThread) { if (socketClient) { closeConnection(); } break; } } void SocketThread::closeConnection() { socketClient->abort(); socketClient->close(); delete socketClient; socketClient = NULL; sum =0; emit proBarDisplay(false); emit conButtonDisplay(true); emit disButtonDisplay(false); } void SocketThread::Stop() { needStopThread = true; } void SocketThread::recvdatagram() { if (socketClient->bytesAvailable() >0) { datagram.resize(socketClient->bytesAvailable()); socketClient->read(datagram.data(), datagram.size()); sum = sum +datagram.size(); emit SumDisplay(sum); emit RecvDateDisplay(datagram); } }
 |