Чтение сетевых данных без readyread() |
Здравствуйте, гость ( Вход | Регистрация )
Чтение сетевых данных без readyread() |
KuvshinoF |
22.4.2021, 10:10
Сообщение
#1
|
Студент Группа: Участник Сообщений: 74 Регистрация: 25.7.2013 Пользователь №: 3887 Спасибо сказали: 0 раз(а) Репутация: 0 |
Задача следующая - постоянно корректно читать сетевые данные (предполагается при запуске потока запускать таймер вычитывания (если они есть конечно) раз в секунду данных из сети). Пример выше не работает - говорит "timer cannot be started from another thread". DataTimer обязателен для некой обработки ситуации отсутствия сетевых данных. И как лучше читать данные - как в примере выше или вместо if сделать while с int size=socket.pendingdatagramsize();? Или лучше как-то по-другому считывать данные? (пробовал вместо таймера запуска чтения данных использовать while(1) {чтение данных} прямо в run, но тогда возникает та же ошибка с таймером DataTimer, который обязателен) |
|
|
Алексей1153 |
22.4.2021, 10:32
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
KuvshinoF, объект MyClass создаётся в другом потоке, нежели где будет работать run. Следовательно, поле класса - тоже будет жить там же, где объект.
в данном случае проблему можно решить так: поле класса QTimer DataTimer; - убрать. В run объявить локальную переменную QTimer DataTimer; Также обратить внимание на: QUDPSocket socket; - возможно, нужно синхронизировать доступ к этому полю класса QByteArray array; - возможно, нужно синхронизировать доступ к этому полю класса short addr, port; - возможно, нужно синхронизировать доступ к этим полям класса. Также их нужно инициализировать а я бы так вообще сделал бесконечный цикл внутри void MyClass::run() без вызова exec() , а в цикле подпинывал бы eventDispatcher() Сообщение отредактировал Алексей1153 - 22.4.2021, 10:30 |
|
|
Текстовая версия | Сейчас: 1.12.2024, 2:06 |