Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
1

СИнхронные операции с QTcpSocket

28.05.2013, 14:11. Просмотров 2878. Ответов 29
Метки нет (Все метки)

Для выполнения синхронных операций используется код
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool send_command( ... )
{
    QMutexLocker locker(&m_mutex);
 
    qint64 bytes = m_socket.write(...);
    if (!m_socket.waitForBytesWritten())
    {
        qCritical() << m_socket.errorString();
        return false;
    }
    Q_ASSERT(bytes == request.size());
    if (!m_socket.waitForReadyRead())
    {
        qCritical() << m_socket.errorString();
        return false;
    }
 
    QByteArray cmd = m_socket.readLine();
        ...
        return true;
}
Но проблема возникает при инициализации и использовании сокета.
Если он был создан в одном потоке, а используется в другом, то вываливается сообщение
C++ (Qt)
1
2
QSocketNotifier: socket notifiers cannot be enabled from another thread
QSocketNotifier: socket notifiers cannot be disabled from another thread
Но логика работы заключается именно в том, что рез этот сокет в отдельном потоке вычитываются
данные. Но создание его и инициализация(длительная) выполняется в другом потоке.

Как избавиться от этой проблемы ? moveToThread ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2013, 14:11
Ответы с готовыми решениями:

Синхронные/асинхронные операции
Подскажите примерный паттерн для приостановки скажем бесконечного цикла, который уже запущен каким...

Чем синхронные операции отличаются от асинхронных?
по сути асинхронная операция, это та которая как багроундворкер будет выполняться в фоновом режиме...

Синхронные ScrollBox'ы
На форме лежат скроллбоксы, как сделать чтобы при прокрутке одного (вертикально, горизонтально)...

Синхронные двигатели
В политехе на лабораторных работах по электрическим машинам запускали синхронные движки с числом...

29
Эксперт С++
1933 / 1045 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
28.05.2013, 14:41 2
дык сокет и так вроде по умолчанию данные асинхронно качает?
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 14:42  [ТС] 3
Цитата Сообщение от l_a_m Посмотреть сообщение
дык сокет и так вроде по умолчанию данные асинхронно качает?
а мне нужно синхронно - запрос/ответ
0
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
28.05.2013, 14:45 4
Цитата Сообщение от xbarmaglot Посмотреть сообщение
Как избавиться от этой проблемы ? moveToThread ?
как вариант использовать дескриптор сокета.
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 14:46 5
Цитата Сообщение от xbarmaglot Посмотреть сообщение
а мне нужно синхронно - запрос/ответ
Ничто не мешает делать это асинхронно ( разве что код получается запутанный... )

QNetworkAccessManager последовательные запросы
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 14:48  [ТС] 6
а мой вариант синхронной операции не пойдет ? с ожиданием ?

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Ничто не мешает делать это асинхронно ( разве что код получается запутанный... )
Это меня и смущает. Нужно будет держать очереди запросов и при получении ответа анализировать и
дергать метод
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 14:49 7
Цитата Сообщение от xbarmaglot Посмотреть сообщение
Это меня и смущает. Нужно будет держать очереди запросов и при получении ответа анализировать и
дергать метод
Какой очереди ?

У вас что сотня запросов делается ?
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 14:51  [ТС] 8
Цитата Сообщение от Avazart Посмотреть сообщение
Какой очереди ?
ну в моем варианте, если несколько потоков захотят получить результаты выполнения неких методов,
то они просто синхронно вызывают их.
Если же это будет асинхронно, то мне нужно будет положить в очередь запросов пакет на обработку (с неким идентификатором), отправить его, а при получении ответа смотреть, кто отправил данный запрос и
как-то сообщить инициатору запроса о результате выполнения.
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 14:51 9
Запроc его слот, в слоте другой запрос - его слот итд. цепочкой
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 14:53  [ТС] 10
Цитата Сообщение от Avazart Посмотреть сообщение
Запроc его слот, в слоте другой запрос - его слот итд. цепочкой
не совсем понял - можно пояснить
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 14:54 11
А что тут непонятно ?

Ответ сервера вызывает слот ....
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 14:58  [ТС] 12
Цитата Сообщение от Avazart Посмотреть сообщение
А что тут непонятно ?

Ответ сервера вызывает слот ....
не понятно как для конкретного ответа зарегистрировать нужный слот
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 15:03 13
Зачем ?
Вызывай из слота метод для конкретного ответа.
И в том же слоте обрабатывай ответ.
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 15:05  [ТС] 14
Цитата Сообщение от Avazart Посмотреть сообщение
Зачем ?
Вызывай из слота метод для конкретного ответа.
И в том же слоте обрабатывай ответ.
вот это и не понятно. Я знаю ответ - какой метод дергать ?
Как этот метод зарегистрировать для конкретного ответа ?
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 15:06 15
По условию ..
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 15:07  [ТС] 16
Цитата Сообщение от Avazart Посмотреть сообщение
По условию ..
Не вкюриваю. Можно примерчик схематичный ?
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 15:08 17
По условию ..

C++ (Qt)
1
2
if( Cmd== someCmd1 )  DoSomeMethod1();
if( Cmd== someCmd2  ) DoSomeMethod2();
Цитата Сообщение от xbarmaglot Посмотреть сообщение
метод зарегистрировать
Что значит зарегистрировать ?
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 15:10  [ТС] 18
А тот, кто делает запрос подписывается на конкретный слот ?
А что если было несколько одинаковых запросов из разных потоков ?
0
Эксперт С++
8353 / 6100 / 610
Регистрация: 10.12.2010
Сообщений: 28,356
Записей в блоге: 29
28.05.2013, 15:11 19
Каких потоков ?
0
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 249
28.05.2013, 15:21  [ТС] 20
Цитата Сообщение от Avazart Посмотреть сообщение
Каких потоков ?
Использующих объект, который инкапсулирует сокет и протокол обмена
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2013, 15:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Синхронные запросы
Добрый вечер! Кто знает как &quot;убить&quot; синхронные запросы? У меня в консоли выходит сообщение что у...

Синхронные сокеты и таймаут
Решил соорудить небольшой наколенный многопоточный клиент dht . Есть некоторые вопросы по сокетам и...

Автоматы синхронные и асинхонные
Синхронный автомат программы не запускаются. по мойму я что-то с дужками напутала. помогите...

Синхронные действия со стилем
В данном коде при наведении на ссылку работает только картинка, фон не меняется &lt;td...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.