crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как правильно читать данные с многопоточным сервером?
Andrewshkovskii
  опции профиля:
сообщение 15.5.2010, 18:50
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Есть клиент (наслденик QTcpSocket) , в нем реализованы функции запроса к серверу :
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 :
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 :

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()
{
    socket = new QTcpSocket();
    connect(socket,SIGNAL(readyRead()),this,SLOT(start()));
    socket->setSocketDescriptor(socketDescriptor);
    qDebug() << "HAHA";
    socket->disconnectFromHost();
    socket->waitForDisconnected();
}


Первый раз пишу клиент/сервер. Но почему-то у меня не запускается поток, т.е. получается что сокет не генирирует сигнал readyRead? А почему, ведь данные приходят от клиента..нет ?


Сообщение отредактировал Andrewshkovskii - 15.5.2010, 19:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Andrewshkovskii
  опции профиля:
сообщение 15.5.2010, 19:21
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Т.е. что бы обработать readyRead в потоке (проще говоря - считать данные с сокета) необходимо создать этот сокет во время работы потока + что бы данные считывались не самим экземпляром потока, а неким объектом по сигналу readyRead от сокета??
================
А если соеденить readyRead сокета с слотом потока?Тоже не будет взаимодействовать, как я понимаю?

Сообщение отредактировал Andrewshkovskii - 15.5.2010, 19:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 15.5.2010, 19:45
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Цитата(Andrewshkovskii @ 15.5.2010, 20:21) *
Т.е. что бы обработать readyRead в потоке (проще говоря - считать данные с сокета) необходимо создать этот сокет во время работы потока + что бы данные считывались не самим экземпляром потока, а неким объектом по сигналу readyRead от сокета??

Да, т.к. экземпляр потока создан в другом потоке, поэтому нельзя делать connect с DirectConnection, т.е. чтобы слот вызывался сразу после испускания сиглнала. По-моему можно QueuedConnection, но я не пробовал так. Signals and Slots Across Threads - тут в ассистенте описание.
P.S. Qt::QueuedConnection - при генерации сигнал помещается в очередь обработки событий.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 15:37