-
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);
- }
- }
|