Название: Как правильно читать данные с многопоточl
Отправлено: andrewshkovskii от Май 15, 2010, 18:53
Есть клиент (наслденик QTcpSocket) , в нем реализованы функции запроса к серверу : C++ (Qt) client::client(QWidget *parent) : QWidget(parent) { socket = new QTcpSocket(this); this->setSocketConnections(); connect(this->connectButton,SIGNAL(clicked()),this,SLOT(connectToServer())); } void client::setSocketConnections() { connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); connect(socket,SIGNAL(connected()),this,SLOT(readTask())); } void client::connectToServer() { netxBlockSize=0; serverIp = ipLineEdit->text(); serverPort = portLineEdit->text().toInt(); socket->abort(); socket->connectToHost(serverIp,serverPort); } void client::readTask() { QByteArray block; QDataStream out(&block,QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_6); out << quint16(0) << 10; out.device()->seek(0); out << quint16 (block.size() - sizeof(quint16)); socket->write(block); }
Сервер от QTcpServer : C++ (Qt) server::server(QObject *parent) : QTcpServer(parent) { connectToDB(); QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); for (int i = 0; i < ipAddressesList.size(); ++i) { if (ipAddressesList.at(i) != QHostAddress::LocalHost && ipAddressesList.at(i).toIPv4Address()) { this->listen(ipAddressesList.at(i),27015); break; } } if (this->serverAddress().isNull()) this->listen(QHostAddress::LocalHost,27015); } void server::incomingConnection(int socketDescriptor) { ClientThread * thread= new ClientThread(socketDescriptor,colors,specifications, this); connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater())); thread->start(); }
И клиентский поток от QThread : C++ (Qt) ClientThread::ClientThread(int socketDescriptor, const QMap <int, QString> & colors, const QMap < int , QPair <QString , QString> > & specification, QObject *parent ) : socketDescriptor(socketDescriptor), colors(colors), specification(specification), QThread(parent) { nextBlockSize = 0; } void ClientThread::run() { qDebug() << "HAHA"; socket = new QTcpSocket(); connect(socket,SIGNAL(readyRead()),this,SLOT(start())); socket->setSocketDescriptor(socketDescriptor); socket->disconnectFromHost(); socket->waitForDisconnected(); }
Первый раз пишу клиент/сервер. Но почему-то у меня не запускается поток, т.е. получается что сокет не генирирует сигнал readyRead? А почему, ведь данные приходят от клиента..нет ?
Название: Re: Как правильно читать данные с многопоточl
Отправлено: ритт от Май 15, 2010, 19:16
а запускать поток не нужно? нет? тогда ладно...
Название: Re: Как правильно читать данные с многопоточl
Отправлено: andrewshkovskii от Май 15, 2010, 19:20
а как же C++ (Qt) connect(socket,SIGNAL(readyRead()),this,SLOT(start()));
Старт не вызовется когда данные по сокету придут? Попробывал напрмую вызывать start() в конструкторе потока - не запускается.
Название: Re: Как правильно читать данные с многопоточl
Отправлено: ритт от Май 15, 2010, 21:24
данные на сокет не придут, т.к. поток не запущен и петли событий нет вообще. давай ты для начала посмотришь кутэшные экзамплы, почитаешь внимательно документацию, вникнешь в собственный код...если "проблема" останется, продолжим обсуждение здесь же.
уделить особое внимание: QThread, QEventLoop, QTcpSocket
Название: Re: Как правильно читать данные с многопоточl
Отправлено: andrewshkovskii от Май 16, 2010, 15:48
Почитал..сделал вот так вот Сделал объект : C++ (Qt) #ifndef REQUESTBROCKER_H #define REQUESTBROCKER_H #include <QObject> #include <QTcpSocket> #include <QDataStream> #include <QByteArray> class requestBrocker : public QObject { Q_OBJECT public: explicit requestBrocker(QTcpSocket * socket, QObject *parent = 0); int nextBlockSize; QTcpSocket * socket; private slots: void readClient(); }; #endif // REQUESTBROCKER_H
C++ (Qt) #include "requestbrocker.h" #include <QDebug> requestBrocker::requestBrocker(QTcpSocket * socket,QObject *parent) : QObject(parent),socket(socket) { nextBlockSize=0; } void requestBrocker::readClient() { qDebug() << "reading client"; QDataStream in(socket); in.setVersion(QDataStream::Qt_4_6); if (nextBlockSize == 0) { if (socket->bytesAvailable() < sizeof(quint16)) { return; } in >> nextBlockSize; } if( socket->bytesAvailable() < nextBlockSize) { return; } quint8 requestType; in >> requestType; if(requestType == 'C') { QByteArray block; QDataStream out(&block,QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_6); out << quint16(0); out.device()->seek(0); out << quint16(block.size() - sizeof(quint16)); socket->write(block); qDebug() << "data writed"; } }
И код run() : C++ (Qt) socket= new QTcpSocket(); socket->setSocketDescriptor(socketDescriptor); requestBrocker * brocker = new requestBrocker(socket); connect(socket,SIGNAL(readyRead()),brocker,SLOT(readClient()),Qt::QueuedConnection); exec(); socket->disconnectFromHost(); socket->waitForDisconnected();
В консоль приходит только : reading client, данные с сокета почему-то не считываются.. Сделал небольшую отладку.. в requestType находиться 0..получается данные куда-то делись, либо я не правильно их читаю.
|