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

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

Страниц: 1 ... 3 4 [5] 6   Вниз
  Печать  
Автор Тема: Система сбора и отображения данных  (Прочитано 40189 раз)
8Observer8
Гость
« Ответ #60 : Март 24, 2014, 19:10 »

Я видимо, перемудрил с сокетами. У меня Server и Viewer соединены по одному каналу. Каждую секунду я перебрасываю строку от Viewer - запрос "currentValues". На этот запрос Sever мне передаёт посылку-строку с названиями и значениями текущих датчиков (которых может быть сколько угодно, по ТЗ не больше 10). По этому же каналу я передаю запрос "getRequiredRange,времяНачала,времяОкончания". Server считывает из базы данных названия и значения датчиков и передаёт их Viewer'у, которых может быть много (в базе данных я также храню время-дату съёма). В том числе вся база данных. И всё это по-одному каналу. Придётся капать в сторону потоков, чтобы завести несколько сокетных соединений.
« Последнее редактирование: Март 24, 2014, 19:17 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #61 : Март 25, 2014, 08:35 »

Я нашёл, как мне кажется, подходящий пример из Qt: ThreadedFortuneServer. Он позволил бы мне обрабатывать такие запросы от клиентов как: запрос на текущие (ежесекундные) данные с датчиков (название датчиков, их значение и время съёма данных), а так же запрос на историю изменений значений датчиков за указанный период.

Проблем появилось очень много. К примеру, клиент тоже придётся как-то переделать через потоки. Один поток запрашивает текущие данные, другой по желанию пользователя запрашивает данные за указанный период.

Одна из текущих проблем: как переделать ThreadedFortuneServer, чтобы он принимал данные от клиента. Так как в этом примере данные генерируются внутри самого класса FortuneServer:
Код
C++ (Qt)
#include "fortuneserver.h"
#include "fortunethread.h"
 
#include <stdlib.h>
 
//! [0]
FortuneServer::FortuneServer(QObject *parent)
   : QTcpServer(parent)
{
   fortunes << tr("You've been leading a dog's life. Stay off the furniture.")
            << tr("You've got to think about tomorrow.")
            << tr("You will be surprised by a loud noise.")
            << tr("You will feel hungry again in another hour.")
            << tr("You might have mail.")
            << tr("You cannot kill time without injuring eternity.")
            << tr("Computers are not intelligent. They only think they are.");
}
//! [0]
 
//! [1]
void FortuneServer::incomingConnection(qintptr socketDescriptor)
{
   QString fortune = fortunes.at(qrand() % fortunes.size());
   FortuneThread *thread = new FortuneThread(socketDescriptor, fortune, this);
   connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
   thread->start();
}
//! [1]
Записан
Bepec
Гость
« Ответ #62 : Март 25, 2014, 11:11 »

Не вижу ваших проблем в упор.
Fortune Server спокойно держит до 15 клиентов, принимает и отсылает данные. И есть подозрение что так будет и при 100+ клиентах.
Вам нужно всего-то свой протокол сделать. Команды запроса-ответа, механизм верификации.
Записан
8Observer8
Гость
« Ответ #63 : Март 25, 2014, 13:55 »

Да, точно, Вы правы! Со стороны сервера при новом соединении создаётся новый сокет:
Код
C++ (Qt)
void IcebreakerServer::readyRead()
{
   // ...
   QTcpSocket* clientSocket = (QTcpSocket*)sender();
   // ...
}
 

Надо со стороны Viewer несколько сокетов завести. Скорее всего, сервер переделывать не придётся. Спасибо! Улыбающийся
Записан
Bepec
Гость
« Ответ #64 : Март 25, 2014, 15:23 »

Зачем несколько сокетов?
Цитировать
В упор не вижу ваших проблем
.
По одному сокету можно спокойно запросить одну команду, потом другую. И периодически посылать третью с интервалом.
Записан
8Observer8
Гость
« Ответ #65 : Март 25, 2014, 15:35 »

А если я запросил командой переслать всю информацию из базы данных? У меня тогда клиент зависнет. Разве нет?
Записан
Bepec
Гость
« Ответ #66 : Март 25, 2014, 16:20 »

м... это долгая операция. Хотя смотря как пересылать. Всё равно в одном пакете не получится, значит просто будут части посылаться. А между пакетами с частями всей инфы можно и любой другой пакет запросить.

PS и да, можно просто блочить интерфейс на ресурсоёмкую операцию. Все так делают, ничего постыдного нет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #67 : Март 25, 2014, 16:23 »

А если я запросил командой переслать всю информацию из базы данных? У меня тогда клиент зависнет. Разве нет?
Почему?
Записан
8Observer8
Гость
« Ответ #68 : Март 26, 2014, 10:04 »

Ура! Я выполнил задание! Всем огромное спасибо! Веселый

Вот так на рисунке выглядят программы: Server, Viewer, Менеджер датчиков:


Исходники
Server: https://github.com/8Observer8/IcebreakerServer/tree/with_sensors_manager
Viewer: https://github.com/8Observer8/IcebreakerViewer/tree/with_sensors_manager
Менеджер датчиков: https://github.com/8Observer8/Sensors

Краткое описание проекта:

"Сервер Данных"
- пользователь запускает программу "Сервер Данных"

"Драйвер Датчика"
- пользователь запускает программу "Драйвер Датчика" (на том же компьютере, что и
"Сервер Данных" или удалённом компьютере)
- добавляет датчики в таблицу, нажимая в меню "Добавить". В открывшимся диалоге
указывает: имя датчика, номер COM-порта. В меню есть так же пункты: "Редактировать", "Удалить" запись из таблицы.
- вводит IP адрес (или имя компьютера) и порт "Сервера Данных"
- нажимает кнопку "Подсоединиться к серверу"
- пользователь может наблюдать текущие значения каждого датчика в приложении "Драйвер Датчика" в таблице

"Сервер Данных"
- после того, как пользователь нажал кнопку "Подсоединиться к серверу" в приложении
"Драйвер Датчика", то "Сервер Данных" начинает принимать данные
- "Сервер Данных" сохраняет данные от датчиков в базу данных в таком виде: имя датчика,
значение датчика, дата и время съёма

"Приложение Оператора"
- пользователь запускает "Приложение Оператора"
- вводит IP адрес (или имя компьютера) и порт сервера
- нажимает кнопку "Подсоединиться к серверу"
- "Приложение Оператора" начинает отправлять запросы приложению "Сервер Данных" каждую секунду
- в ответ приложение "Сервер Данных" присылает текущие значения датчиков
- "Приложение Оператора" отображает текущие значения датчиков
- пользователь вводит требуемый временной диапазон (дата-время) и получает от
приложения "Сервер Данных" значения датчиков за указанный период
- пользователь так же может узнать значение указанного датчика в указанный момент
времени, а так же значения указанного датчика в указанный период времени

Дополнительная функциональность (которую я не успел реализовать на Qwt). Пользователь может
наблюдать текущие значения датчиков на графике в "Приложении Оператора" (графики рисуются в
реальном времени). Как в примере из Qwt:

Записан
8Observer8
Гость
« Ответ #69 : Март 27, 2014, 15:46 »

Облом... Вчера отправил задание на проверку. Сегодня позвонил. Сказали, что у них в компании какие-то проблемы и они экстренно все вакансии закрыли. Вот эта вакансия: http://www.volgasoft.com/careers.htm#cppj

По Qt в Саратове ничего больше нет. И эта компания подходила, так как они работают с зарубежным заказчиком. Хотелось ещё английский, чтобы пригодился (хотя он ещё очень плох). Теперь либо удалённо искать на Qt, либо изучать C# или Java.

Наверное всё же посижу ещё немного на шеи у родителей, отлично изучу C++ и Qt и найду себе работу по удалёнке!
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #70 : Март 27, 2014, 15:52 »

они экстренно все вакансии закрыли.
А что они там вообще делали?
Записан
8Observer8
Гость
« Ответ #71 : Март 27, 2014, 16:19 »

По-моему, то же самое что и я делал, только для конкретных систем и в других масштабах. Системы сбора, хранения и визуализации данных. Российский заказчик у них ГазПром. Пишут ПО для управления промышленным оборудованием.
Записан
Bepec
Гость
« Ответ #72 : Март 27, 2014, 16:51 »

Если они используют то, что я думаю, то о Qt можно было бы забыть в начинке Веселый Есть вроде одна система специально под газпром написанная Улыбающийся

Разве что для интерфейса Улыбающийся
Записан
8Observer8
Гость
« Ответ #73 : Март 27, 2014, 16:56 »

У них ещё .NET. А так они в основном с зарубежным заказчиком работают. Вот что они применяют для разработок: http://www.volgasoft.com/expertise/
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #74 : Март 27, 2014, 16:58 »

Если они используют то, что я думаю, то о Qt можно было бы забыть в начинке Веселый
Для чего искать разработчиков Qt, что бы они забыли про Qt? Улыбающийся

Разве что для интерфейса Улыбающийся
Ну так Qt для этого и предназначен. Улыбающийся
Записан
Страниц: 1 ... 3 4 [5] 6   Вверх
  Печать  
 
Перейти в:  


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