crossplatform.ru

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

> Чтение сетевых данных без readyread()
KuvshinoF
  опции профиля:
сообщение 22.4.2021, 10:10
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 25.7.2013
Пользователь №: 3887

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




Репутация:   0  


class MyClass:: public QThread()
{
  ...
  void run();
  QTimer   DataTimer;
  QUDPSocket socket;
  QByteArray array;
  short addr, port;

public slots:
  void myslot();
  void noData();
}
////////////////////////////////////////////////////////////
MyClass::MyClass()
{
  
}
///////////////////////////////////////////////////////////
void MyClass::run()
{
   DataTimer.setInterval(3000);
   connect(&DataTimer, SIGNAL(timeout()), this, SLOT(noData()));
   QTimer timer;
   connect(&timer, SIGNAL(timeout()), this, SLOT(myslot()), Qt::DirectConnection);
   timer.start(1000);
   exec();
}
///////////////////////////////////////////////////////////

void MyClass::myslot()
{
   if (socket.hasPendingDatagrams())
  {
     DataTimer.stop();
     int size = socket.bytesAvailable();
     array.resize(size);
     socket.readDatagram(array.data(), size, &addr, &port);
     // обработка данных
     DataTimer.start();
  }
}
///////////////////////////////////////////////////////////

void MyClass::noData()
{

}
///////////////////////////////////////////////////////////

Задача следующая - постоянно корректно читать сетевые данные (предполагается при запуске потока запускать таймер вычитывания (если они есть конечно) раз в секунду данных из сети). Пример выше не работает - говорит "timer cannot be started from another thread". DataTimer обязателен для некой обработки ситуации отсутствия сетевых данных. И как лучше читать данные - как в примере выше или вместо if сделать while с int size=socket.pendingdatagramsize();? Или лучше как-то по-другому считывать данные? (пробовал вместо таймера запуска чтения данных использовать while(1) {чтение данных} прямо в run, но тогда возникает та же ошибка с таймером DataTimer, который обязателен)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
KuvshinoF
  опции профиля:
сообщение 22.4.2021, 15:02
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 25.7.2013
Пользователь №: 3887

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




Репутация:   0  


1. Как же я тогда локальную переменную QTimer DataTimer буду использовать в другом слоте чтения данных myslot? Как мне узнавать момент отсутствия данных (думал сделать таймером с таймаутом через 3 сек.)
2. Что значит (как сделать) синхронизировать доступ?
3. Можно примерчик на подпинывание eventDispatcher() ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 30.11.2024, 23:34