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

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

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: QTCPSocket в отдельном потоке.  (Прочитано 29638 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #45 : Январь 12, 2017, 10:44 »

А как в ожидание уйти?
Просто выйти из слота обработчика.

Мне изначально неизвестен размер пакета.
У вас в m_buffer будут все данные, ищите в нем начальный/конечный маркер, или как там вы длину определяете.

А readAll(); это что?
QByteArray QIODevice::readAll()

Сокет наследник QIODevice.
Записан
stix357
Гость
« Ответ #46 : Январь 12, 2017, 11:39 »

А как в ожидание уйти?
Просто выйти из слота обработчика.

Мне изначально неизвестен размер пакета.
У вас в m_buffer будут все данные, ищите в нем начальный/конечный маркер, или как там вы длину определяете.

А readAll(); это что?
QByteArray QIODevice::readAll()

Сокет наследник QIODevice.
Хм, огромное спасибо. Мой дурацкий цикл идет нафиг.
А как мне узнать сколько я получил в порции(пакете), не пересчитывая каждый раз m_buffer ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #47 : Январь 12, 2017, 11:49 »

> А как мне узнать сколько я получил в порции(пакете), не пересчитывая каждый раз m_buffer ?
Конкретизируй вопрос.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
stix357
Гость
« Ответ #48 : Январь 12, 2017, 12:10 »

> А как мне узнать сколько я получил в порции(пакете), не пересчитывая каждый раз m_buffer ?
Конкретизируй вопрос.
Ммм ... Вот такая штука по совету Old (Да хранят его боги!) получилась
Код
C++ (Qt)
// Слот обработки сигнала readyRead()
void TCPClientQt::onReadData()
{
 
   QString strArr="";
   int pos;
   m_ReadBuffer += m_pTcpSocket->readAll();
   //m_ptxtInfo->append(QTime::currentTime().toString("hh:mm:ss.zzz")
                      //+" onReadData "+QString::number(m_ReadBuffer.size()));
   //m_count=m_pTcpSocket->bytesAvailable()+m_count;m_count=+m_count;
   // Мы все вычитываем в буфер m_buffer
   // Здесь мы можем проверить находится ли в буфере полный пакет данных для обработки, если да - обрабатываем его и выкусываем из буфера
   if(!isBegin && m_ReadBuffer.contains("+WIND:83:"))
   {
       pos=17;
       strArr=m_ReadBuffer.left(pos);
       m_ptxtInfo->append(QTime::currentTime().toString("hh:mm:ss.zzz")
                          +" Begin "+QString::fromAscii("+WIND:83:"));
       isBegin=true;
   }
   if(!isEnd && m_ReadBuffer.contains("+WIND:85:"))
   {
       pos=m_ReadBuffer.indexOf("+WIND:85:");
       strArr=m_ReadBuffer.right(17);
       m_ptxtInfo->append(QTime::currentTime().toString("hh:mm:ss.zzz")
                          +" End "+QString::fromAscii("+WIND:85:"));
      isEnd=true;
   }
   m_ptxtInfo->append(QTime::currentTime().toString("hh:mm:ss.zzz")
                      +" Recive "+QString::number(m_count));
   //Если в буфере осталась только часть пакета, то просто выходим и ждем следующую порцию данных
}
 
Я хочу узнать сколько прибежало в пакете, дабы посчитать сумму не бегая каждый раз по размеру m_ReadBuffer.size() - вроде это накладно, каждый раз пересчитывается размер массива.
m_count=m_pTcpSocket->bytesAvailable()+m_count;
но m_pTcpSocket->bytesAvailable() равно 0 Грустный
« Последнее редактирование: Январь 12, 2017, 12:15 от stix357 » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #49 : Январь 12, 2017, 12:17 »

Вызвать лишний раз QByteArray::size не страшно. Там вообще наверное инлайновый метод.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #50 : Январь 12, 2017, 12:25 »

но m_pTcpSocket->bytesAvailable() равно 0 Грустный
Это вы после чтения вызываете? Конечно там 0 будет.

И не увидел у вас выкусывание уже обработанного пакета из m_buffer?
Записан
stix357
Гость
« Ответ #51 : Январь 12, 2017, 12:57 »

Это вы после чтения вызываете? Конечно там 0 будет.
Я полагал, что там все одно цикл чтения, пока пакеты бегут.

И не увидел у вас выкусывание уже обработанного пакета из m_buffer?
А это черновик пока (отдельная прога для тестирования) без выкусывания Улыбающийся Еще в поток упихать надо.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #52 : Январь 12, 2017, 13:01 »

Еще в поток упихать надо.
Зачем? Там долгая обработка пакета?
Записан
stix357
Гость
« Ответ #53 : Январь 12, 2017, 13:16 »

Еще в поток упихать надо.
Зачем? Там долгая обработка пакета?
Не, это модуль, который встраивается в основную программу.
И там в отдельном потоке приходят сигналы еще с 2-х устройств. Встроенные платы АЦП.
Одна стробирующие импульсы выдает по прохождению трубы в установке через каждые 50 мм.
А труба летит со скоростью 700 мм/сек.
А вторая плата АЦП температуру привода выдает.
И мне данные со своей части с ними увязать надо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #54 : Январь 12, 2017, 13:25 »

Еще в поток упихать надо.
Зачем? Там долгая обработка пакета?
Не, это модуль, который встраивается в основную программу.
И там в отдельном потоке приходят сигналы еще с 2-х устройств. Встроенные платы АЦП.
Одна стробирующие импульсы выдает по прохождению трубы в установке через каждые 50 мм.
А труба летит со скоростью 700 мм/сек.
А вторая плата АЦП температуру привода выдает.
И мне данные со своей части с ними увязать надо.
У меня есть прога для парсинга данных от автомобильных трекеров. Идет чтение бинарных данных из сокета, парсинг их, формирование xml и выдача его наружу. Одновременно обрабатывается сейчас до 3К трекеров - загрузка процессора меньше 10%. Да, ассинхронка с одним основным потоком. Улыбающийся А данные трекеры шлют часто, пакетов по 10 в секунду может быть.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
stix357
Гость
« Ответ #55 : Январь 12, 2017, 13:28 »

У меня есть прога для парсинга данных от автомобильных трекеров. Идет чтение бинарных данных из сокета, парсинг их, формирование xml и выдача его наружу. Одновременно обрабатывается сейчас до 3К трекеров - загрузка процессора меньше 10%. Да, ассинхронка с одним основным потоком. Улыбающийся А данные трекеры шлют часто, пакетов по 10 в секунду может быть.
А тут еще надо параллельно график в Гуе для оператора выводить, по мере поступления данных. Вот и приходится с потоками возится.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #56 : Январь 12, 2017, 13:30 »

У меня есть прога для парсинга данных от автомобильных трекеров. Идет чтение бинарных данных из сокета, парсинг их, формирование xml и выдача его наружу. Одновременно обрабатывается сейчас до 3К трекеров - загрузка процессора меньше 10%. Да, ассинхронка с одним основным потоком. Улыбающийся А данные трекеры шлют часто, пакетов по 10 в секунду может быть.
А тут еще надо параллельно график в Гуе для оператора выводить, по мере поступления данных. Вот и приходится с потоками возится.
Тогда далаются 2 потока - в одном гуй живет, а в другом все общение с девайсами. И прячется все за каким-нибудь Фасадом.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #57 : Январь 12, 2017, 13:31 »

А еще можно разделить на гуй и сервис.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


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