Russian Qt Forum
Май 18, 2024, 06:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно читать данные с многопоточl  (Прочитано 3426 раз)
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? А почему, ведь данные приходят от клиента..нет ?
« Последнее редактирование: Май 15, 2010, 19:32 от andrewshkovskii » Записан
ритт
Гость
« Ответ #1 : Май 15, 2010, 19:16 »

а запускать поток не нужно? нет? тогда ладно...
Записан
andrewshkovskii
Гость
« Ответ #2 : Май 15, 2010, 19:20 »

а как же    
Код
C++ (Qt)
connect(socket,SIGNAL(readyRead()),this,SLOT(start()));
Старт не вызовется когда данные по сокету придут?
Попробывал напрмую вызывать start() в конструкторе потока - не запускается.
Записан
ритт
Гость
« Ответ #3 : Май 15, 2010, 21:24 »

данные на сокет не придут, т.к. поток не запущен и петли событий нет вообще.
давай ты для начала посмотришь кутэшные экзамплы, почитаешь внимательно документацию, вникнешь в собственный код...если "проблема" останется, продолжим обсуждение здесь же.

уделить особое внимание: QThread, QEventLoop, QTcpSocket
Записан
andrewshkovskii
Гость
« Ответ #4 : Май 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..получается данные куда-то делись, либо я не правильно их читаю.
« Последнее редактирование: Май 16, 2010, 16:21 от andrewshkovskii » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.524 секунд. Запросов: 17.