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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QLocalServer <--> QLocalSocket  (Прочитано 7365 раз)
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");
                }
Записан
kkk777kkk
Гость
« Ответ #1 : Апрель 24, 2010, 13:43 »

вкладываю пример по которому разбирался я Улыбающийся
может поможет, система общения там красивая и видно как ловить ответы и как посылать и где конекшн держать...
Записан
biz_0n
Гость
« Ответ #2 : Апрель 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 раза, а потом главный поток вообще зависает. Что делать?
Записан
kkk777kkk
Гость
« Ответ #3 : Апрель 27, 2010, 09:49 »

ну данные и не должны приходить за один раз все, так что нормально, что несколько раз заходит в цикл и это надо учитывать
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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