Russian Qt Forum

Qt => Общие вопросы => Тема начата: biz_0n от Апрель 24, 2010, 12:10



Название: QLocalServer <--> QLocalSocket
Отправлено: biz_0n от Апрель 24, 2010, 12:10
возникла проблема при передачи данных между QLocalServer <--> QLocalSocket.
Есть 2 потока, из главного передаётся информация во второй. Второй поток должен ожидать появления информации. Как только к нему что-то пришло, он обрабатывает эту информацию и должен ждать следующего появления данных.
В QLocalSocket есть метод waitForBytesWritten(-1). Если отправлять информацию с сервера, с помощью метода nextPendingConnection()->write(),  данные то доходят, то нет. А если информацию отправлять с клиента, то как на сервере ожидать прихода данных? У меня есть подозрение, что после вызова nextPendingConnection(), возвращаемый ею сокет поднимается из стэка и разрушается.

Код:
//где-то в конструкторе 
     reader->connectToServere("server");
//-----------------------
//Ожидание данных
        QByteArray data;
while(data.data() != "Enter")
{
кeader->waitForBytesWritten(-1);
data = reader->readAll();
                //do something
}

Код:
//где-то в конструкторе
    writer->listen("server");
//-----------------------
//Передача данных
                if(writer->hasPendingConnections())
{
                     write->nextPendingConnection()->write("some data");
                }


Название: Re: QLocalServer <--> QLocalSocket
Отправлено: kkk777kkk от Апрель 24, 2010, 13:43
вкладываю пример по которому разбирался я :)
может поможет, система общения там красивая и видно как ловить ответы и как посылать и где конекшн держать...


Название: Re: QLocalServer <--> QLocalSocket
Отправлено: biz_0n от Апрель 25, 2010, 13:17
теперь возникла проблема с их синхронизацией:
Код:
//Клиент
QString str;

while(str != "Enter")
{
emit requestPin();
while (reader->bytesAvailable() < (int)sizeof(quint16))
{
if (!reader->waitForReadyRead(-1))
{
qDebug() <<  "error";
}
}
quint16     m_nNextBlockSize(0);
QDataStream in(reader);
in.setVersion(QDataStream::Qt_4_6);
for (;;)
{
if (!m_nNextBlockSize) {
if (reader->bytesAvailable() < sizeof(quint16)) {
break;
}
in >> m_nNextBlockSize;
}

if (reader->bytesAvailable() < m_nNextBlockSize) {
break;
}
in >> str;
m_nNextBlockSize = 0;
}
qDebug() << str;

if(str == "Cancel")
{
return "cancel";
}
}

Код:
//Сервер
QByteArray  arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_6);
out << quint16(0) << ((QPushButton*)sender())->text();
out.device()->seek(0);
out << quint16(arrBlock.size() - sizeof(quint16));
client->write(arrBlock);

Проблема заключается в том, что когда сервер передаёт информацию клиенту, клиент успевает прогнать цикл 4 раза, а потом главный поток вообще зависает. Что делать?


Название: Re: QLocalServer <--> QLocalSocket
Отправлено: kkk777kkk от Апрель 27, 2010, 09:49
ну данные и не должны приходить за один раз все, так что нормально, что несколько раз заходит в цикл и это надо учитывать