crossplatform.ru

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

> QTcpSocket и синхронный протокол, Как получать ответ
canavar
  опции профиля:
сообщение 26.3.2009, 22:54
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 26.3.2009
Пользователь №: 643

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




Репутация:   0  


Все доброго вечера.

Непонятно, как решать вот такую проблему. Существует синхронный протокол передачи уровня приложения. Я посылаю команду, жду - приходит ответ. В простом режиме работы с QTcpSocket все понятно: создали, соединили сигналы со слотами. Отправляем данные, когда нам отвечают - вызывается слот OnReadyRead() и дальше делаем с данными все что хотим.

Есть желание сделать метод, который будет возвращать весь ответ, то типа того:

QStringList getAnswer(QString &cmd);

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

Такое вообще реально реализовать?

Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 27.3.2009, 3:20
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


По поводу qWait(int msec) ничего сказать не могу, никогда ее не использовал. Хотя в ассистенте написано, что Gui и сетевой интерфейс она не блокирует. Правильно ли это тянуть с собой в приложении функционал из QTestLib?

Мне не совсем понятно, что значит "весь ответ". У Вас есть критерий, по которомы Вы можете определить, что все ожидаемые данные получены? Или единственным критерием будет являться то, что в соккет какое-то время данные не поступают.

В любом случае, я вижу только два пути. Первое - организовать все через блокирующую функцию waitForReadyRead(int msecs), т.е. примерно так
Раскрывающийся текст
const QStringList & getAnswer(const QString &cmd) {
    socket.write(qPrintable(cmd));
    socket.flush();

    QStringList strlist;
    forever {
        if(waitForReadyRead(1000)) {
            strlist << socket.read(socket.bytesAvailable());
        } else break;
    }
    return strlist;
}

Что, как сами понимаете, делать не стОит, т.к. Gui будет заблокированно на неопределенное время. (Хотя всегда можно добавить qApp->processEvents(). Но мне такой подход не нравится.)

Во втором случае - это, как уже предлогалось, сделать все это в дочернем потоке. Правда структура проекта будет несколько иной, что Вы изначально хотели.

Раскрывающийся текст
void ThreadSocket::run()
{
    QStringList strlist;
    emit SendServer("cmd"); // отправляем данные для записи в соккет
    QMutexLocker locker(&mutex);
    forever {
        if ( cond.wait(&mutex, 1000) ) {
            strlist << DataIn; //  DataIn - данные полученные по соккету, в обработчике события readyRead()
            DataIn.clear();
        } else break;
    }
    emit sendData(strlist); // отправляем полученные данные.
}

P.S. Коды не компилил. Надеюсь сильно нигде не облажался :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 25.4.2024, 9:09