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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как бы лучше спроиктировать такую архитектуру.  (Прочитано 12275 раз)
a1ien
Гость
« : Июнь 21, 2012, 15:23 »

Использую QextSerialPort для работы с COM портом.
Есть клсс PortListener у него есть
такой слот
Код
C++ (Qt)
void PortListener::onReadyRead()
{
   emit DataRead(port->readAll());
}
Который связан таким образом с QextSerialPort.
Код
C++ (Qt)
connect(port/*QextSerialPort*/, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
Также генерирует сигнал DataRead собственно с данными полученными по COM порту.
На другом концу весит некий девайс с которым нужно общаться по определенному протоколу.

А теперь собственно вопрос.
Как лучше всего(и правильнее) реализовать взаимодействие с ним.

Щас у меня так сделано(скорее всего это очень криво)
Код
C++ (Qt)
 
void MainWindow::on_Sync_clicked()
{
   ui->Sync->setEnabled(false);
   PortSettings comPortSettings;
   comPortSettings.BaudRate=BAUD9600;
   comPortSettings.DataBits=DATA_8;
   comPortSettings.FlowControl=FLOW_OFF;
   comPortSettings.Parity=PAR_NONE;
   comPortSettings.StopBits=STOP_1;
   listener->open(ui->comPorts->currentText(),comPortSettings);
   listener->SendCommand(QByteArray(512,0x00));
 
}
void MainWindow::DataRead(const QByteArray& data) // слот которые соединен с сигналом DataRead у PortListener
{
 qDebug(data);
 QByteArray buf=data.toHex();
 switch(state)
   {
   case NOTSYNCKED:
     {
       if(buf.contains("0d0a3e")) {
           state=SYNCKED;
           listener->SendCommand(QByteArray::fromHex("4200c20100"));
           Sleep(300);
           listener->setBaudRate(BAUD115200);
           listener->SendCommand(QByteArray::fromHex("0d"));
 
         }
       break;
     }
   case SYNCKED:{
       if(buf.contains("0d0a3e")) {
           state=READY;
           SendBinary("fw.bin");
           Run();
         }
     }
 
   default:
     break;
   }
}
 

Что хотелось бы, чтобы была возможность и асинхронно работать и при этом оставить возможность синхронной работы.
например чтобы можно было сделать вот так(как еще один вариант)
Код
C++ (Qt)
void MainWindow::on_Sync_clicked()
{
   ui->Sync->setEnabled(false);
   PortSettings comPortSettings;
   comPortSettings.BaudRate=BAUD9600;
   comPortSettings.DataBits=DATA_8;
   comPortSettings.FlowControl=FLOW_OFF;
   comPortSettings.Parity=PAR_NONE;
   comPortSettings.StopBits=STOP_1;
   listener->open(ui->comPorts->currentText(),comPortSettings);
   listener->SendCommand(QByteArray(512,0x00));
QEventLoop eventLoop;
   connect( listener->port,SIGNAL(onReadyRead()),&eventLoop, SLOT(quit()));
   eventLoop.exec();
listener->SendCommand(QByteArray::fromHex("4200c20100"));
           Sleep(300);
           listener->setBaudRate(BAUD115200);
           listener->SendCommand(QByteArray::fromHex("0d"));
}
Записан
Bepec
Гость
« Ответ #1 : Июнь 21, 2012, 15:31 »

Sleep в основном потоке детектед. Ну что сказать - учи потоки Веселый
Записан
a1ien
Гость
« Ответ #2 : Июнь 21, 2012, 15:34 »

Да да Sleep, но тут эта функция выполняеться один раз.
Но собственно я по этом тоже справшивал как бы организовать синхронную работу)
Записан
mutineer
Гость
« Ответ #3 : Июнь 21, 2012, 16:44 »

Да да Sleep, но тут эта функция выполняеться один раз.
Но собственно я по этом тоже справшивал как бы организовать синхронную работу)

Юзать отдельный поток для работы с портом
Записан
a1ien
Гость
« Ответ #4 : Июнь 21, 2012, 17:45 »

Код
C++ (Qt)
Юзать отдельный поток для работы с портом
И чем это поможет? (я имею введу что мне это даст, я правда хочу понять)
Записан
mutineer
Гость
« Ответ #5 : Июнь 21, 2012, 17:51 »

Код
C++ (Qt)
Юзать отдельный поток для работы с портом
И чем это поможет? (я имею введу что мне это даст, я правда хочу понять)

ты замораживаешь главный поток слипом, что есть плохо, от этого надо избавляться. Ибо все это время (да, пока что небольшое) приложение выглядит зависшим
Записан
Bepec
Гость
« Ответ #6 : Июнь 21, 2012, 17:52 »

Краткий ликбез. Ибо я ем кильку в томатном соусе и добр.

Поток - это там где исполняются твои команды.
У каждого приложения минимум 1 поток.
Именно 1 поток отрисовывает ГУИ(интерфейс).
Но если 1 будет рисовать, а второй работать с портом ПАРАЛЛЕЛЬНО, это же лучше 1? Улыбающийся
Записан
a1ien
Гость
« Ответ #7 : Июнь 21, 2012, 17:59 »


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

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 21, 2012, 18:17 »

Но если 1 будет рисовать, а второй работать с портом ПАРАЛЛЕЛЬНО, это же лучше 1? Улыбающийся
А чем оно "лучше"? Только тем что "так часто делают"?  Улыбающийся

Что хотелось бы, чтобы была возможность и асинхронно работать и при этом оставить возможность синхронной работы.
например чтобы можно было сделать вот так(как еще один вариант)
Так или иначе приходится ждать "ответа с той стороны" - наверное под синхронностью понимается "модальность" этого ожидания, типа дождались и потом продолжаем заниматься свои делом. Тогда можно действовать через QApplication::processEvents - и подобрать нужный флажок-параметр. А sleep конечно плохо
Записан
Bepec
Гость
« Ответ #9 : Июнь 21, 2012, 18:49 »

Если много рисовать, или ждать. То 1 поток это плохо Веселый Это аксиома, подтверждения не требующая Веселый

Не спорю, в 1 поток создать работоспособную прекрасную программу возможно. Но позже вылезают обидные косячки Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Если много рисовать, или ждать. То 1 поток это плохо Веселый Это аксиома, подтверждения не требующая Веселый
Один тут давеча тоже выдвигал аксиомы - у него подучились?  Улыбающийся

Не спорю, в 1 поток создать работоспособную прекрасную программу возможно. Но позже вылезают обидные косячки Веселый
Насколько я понял, человек спрашивает не об этом. Лучше ли читать в др нитке - но то уже др вопрос. А спрашивалось как не отдавать управление, тут без разницы в какой нитке читатель, все равно придется крутить вторичный цикл
Записан
Bepec
Гость
« Ответ #11 : Июнь 21, 2012, 19:30 »

Igors не забываем - каждый советует так, как сам бы поступил Веселый

Способов реализации - море. Я выбираю несколько потоков.

Что даст - возможность работать с портом "без оглядки" на отображение. Синхронность или асинхронность сам определишь Улыбающийся

Что даст реализация без потоков на таймерах - хз. Даст реализацию работы с портом без потоков Веселый
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

А никто еще не посоветовал использовать QtSerialPort вместо QextSerialPort, т.к. последний имеет очень кривую архитектуру. Улыбающийся

И если будешь использовать QtSerialPort - то никакие потоки не нужны.
Записан

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

QtSerialPort вроде под Qt 5.0 пишется. И ещё в процессе разработки, не?

Я лично использую свою самописную библиотечку - ибо все имеющиеся для qt (типа Qext и прочая) жутко глючили и хреново передавали Веселый
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



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

QtSerialPort вроде под Qt 5.0 пишется. И ещё в процессе разработки, не?
под 4.7.4 тоже робит ) И отлично так робит, зуб даю Улыбающийся
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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