| 
 Название: Как правильно читать данные с многопоточ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..получается данные куда-то делись, либо я не правильно их читаю.
 
 |