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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как бы лучше спроиктировать такую архитектуру.  (Прочитано 12229 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #15 : Июнь 22, 2012, 10:02 »

Цитата: Bepec
QtSerialPort вроде под Qt 5.0 пишется. И ещё в процессе разработки, не?
А ты почитай по ссылке что я дал, и все узнаешь  Улыбающийся
« Последнее редактирование: Июнь 22, 2012, 10:10 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
a1ien
Гость
« Ответ #16 : Июнь 22, 2012, 13:17 »

Сколько всего на отвечали))
1) Спасибо за ссылку на QtSerialPort посмотрю что да как.
2) По поводу Sleep это просто была временная заглушка.
3) Объясните пожалуйста как(и чем) помогли бы дополнительные потоки в работа частично синхронно, а частично асинхронно.
Грубо говоря мне вначале надо выполнить синхронно некоторую инициализацию на стороне девайся, а потом я бы хотел асинхронно кидать и ловить от него сообщения.
Записан
Bepec
Гость
« Ответ #17 : Июнь 22, 2012, 14:07 »

Порт работает асинхронно так то, но программно ты можешь что угодно написать. Флаги/стражи в вперёд.

Уже пояснял:

Код:
Поток - это там где исполняются твои команды.
У каждого приложения минимум 1 поток.
Именно 1 поток отрисовывает ГУИ(интерфейс).
Но если 1 будет рисовать, а второй работать с портом ПАРАЛЛЕЛЬНО, это же лучше 1?

Если это не понятно, то запусти Тотал коммандер. И попытайся скопировать какой-нить большой файл. И у тебя будет открыт второй поток, который отрисует окошечко для копирования, который ты можешь остановить/притормозить/перемещать, независимо от основного потока.

Записан
a1ien
Гость
« Ответ #18 : Июнь 22, 2012, 14:48 »

Да понимаю я что-такое поток.
Щас объясню что непонятно.

У нас есть функция записи в порт. У нас есть слот который вызваться когда нам приходят данные. Они работаю асинхронно, это понятно.
Дальше если мы будем ждать в on_Sync_clicked() когда нам придет что-то в порт, то понятно что мы этого некогда не дождемся, так-как у нас один поток.
Это все понятно.
Не доконца ясно почему нам помогает QEventLoop(точнее вот эта конструкция
Код
C++ (Qt)
QEventLoop eventLoop;
   connect( listener->port,SIGNAL(onReadyRead()),&eventLoop, SLOT(quit()));
   eventLoop.exec();
), eventLoop же не создает отдельного потока(почему он может получить сигнал onReadyRead())
Понял почему, он запускает цикл ожидания события.

Дальше из этого всего вытикает вопрос, как делать синхронно, Я так понимаю вы предлагате такую вещь,
Мы переносим класс PortListener в отдельный поток, в функции MainWindow::on_Sync_clicked()(в которой нам нужно поработать синхронно) мы расставляем например мютексы(тут опять вопрос, медь если мы там поставим мютекс то GUI поток зависнит, и как нам ждать результат )

Еще раз я понимаю что-такое потоки, но не понимаю как ОНИ НАМ ПОМОГУТ.
Можете описать что в каждом потоке вы предлагате мне сделать.
« Последнее редактирование: Июнь 22, 2012, 15:14 от a1ien » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Июнь 22, 2012, 15:15 »

Сколько всего на отвечали))
Ну так если не нравится - никто не мешает "проиктировать" самому  Улыбающийся

У нас есть функция записи в порт. У нас есть слот который вызваться когда нам приходят данные. Они работаю асинхронно, это понятно.
Дальше если мы будем ждать в on_Sync_clicked() когда нам придет что-то в порт, то понятно что мы этого некогда не дождемся, так-как у нас один поток.
Очень даже дождемся если будем ждать примерно так
Код
C++ (Qt)
// какие-то действия, напр инициализация
connect( listener->port,SIGNAL(onReadyRead()),&eventLoop, SLOT(quit(), Qt::QueuedConnection));
...
while (true) {
QApplication::processEvents(..);
..
if (flagQuit) break;
}
// продолжаем делать что хотели
 
Сигнал с QueuedConnection - это event которое придет в свой eventLoop (в данном случае главной нитки) если мы скажем ему обрабатывать события (processEvents). Надо только в слоте quit его опознать, (напр взвести флажок) чтобы "вытикать" из цикла while  Улыбающийся

Записан
Bepec
Гость
« Ответ #20 : Июнь 22, 2012, 15:48 »

Уважаемый a1ien. Вы знаете определение потока. Вы молодец Улыбающийся

Но вы видимо слабо знаете сигнал-слотовую архитектуру и межпотоковое взаимодействие. Советую их вам подучить, а так же почитать Бланшета.
Записан
a1ien
Гость
« Ответ #21 : Июнь 22, 2012, 16:08 »

Bepec, вы типичный троль с вами общаться даже не хочеться.

Igors,
Цитировать
Цитировать
Сколько всего на отвечали))
Ну так если не нравится - никто не мешает "проиктировать" самому
Это наоборот было в позитивном ключе сказано, то есть я только рад что много ответов.
Спасибо большое вам а ваши ответы они дают направление куда стоит копать.
Код
C++ (Qt)
// какие-то действия, напр инициализация
connect( listener->port,SIGNAL(onReadyRead()),&eventLoop, SLOT(quit(), Qt::QueuedConnection));
...
while (true) {
QApplication::processEvents(..);
..
if (flagQuit) break;
}
// продолжаем делать что хотели
Я так понимаю что это почти тоже самое, что и мой код с
Код
C++ (Qt)
QEventLoop eventLoop;
   connect( listener->port,SIGNAL(onReadyRead()),&eventLoop, SLOT(quit()));
   eventLoop.exec();
Просто другая реализация, а нету более красивого примера с идеологической точки зрения?)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июнь 22, 2012, 16:29 »

Я так понимаю что это почти тоже самое, что и мой код с
Код
C++ (Qt)
QEventLoop eventLoop;
   connect( listener->port,SIGNAL(onReadyRead()),&eventLoop, SLOT(quit()));
   eventLoop.exec();
Просто другая реализация, а нету более красивого примера с идеологической точки зрения?)
С идеологической все это "вторичный цикл событий", который широко используется, и это нормальная практика. Однако запускать свой локальный eventLoop обычно невыгодно, т.к. UI остается замороженным, приходится прилагать усилия чтобы прервать операцию и.т.п. Практичнее создать локальный объект, у него слот, он и получит сигнал в текущем eventLoop.
Записан
a1ien
Гость
« Ответ #23 : Июнь 22, 2012, 16:36 »

Спасибо большое. Вопрос можно считать закрытым.
Записан
Bepec
Гость
« Ответ #24 : Июнь 22, 2012, 16:38 »

И тут троллем обзывают Веселый

Видимо что-то с кармой, или с желанием спрашивающих узнать ответ на свой вопрос Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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