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

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

Страниц: 1 ... 3 4 [5]   Вниз
  Печать  
Автор Тема: Как разрулить потоки  (Прочитано 26492 раз)
Bepec
Гость
« Ответ #60 : Июль 26, 2016, 18:46 »

В общем вы не поймёте. Тут нужно логику строить на откликах асинхронных, а вы асинхронности не понимаете от слова вообще.
Это будет как минимум 1 слот MainWindow::on_pushButton_clicked()  и ещё 1 слот на чтение значения и дальнейшей логики.

PS разговор глухонемого со слепым получается Веселый
PPS а то, что вы хотите - это написание собственного скриптового движка. Вам проще заплатить и вам напишут.
Записан
Sphynx
Гость
« Ответ #61 : Июль 26, 2016, 19:23 »

Да что-то мы друг друга не понимаем. Вообще-то никакие скриптовые движки не нужны.
В моей реализации внутри MainWindow::on_pushButton_clicked()  будет
Код
C++ (Qt)
mcu->Send("PORT DDR $FF 0 ;");
//Wait 2 Ok
if(mcu->Read()!=m_Ok){//Error}
if(mcu->Read()!=m_Ok){//Error}
mcu->Send("ADC 5 ;");
//Wait Num
if(mcu->Read()!=m_Num){//Error}
if(mcu->ReadNum<100)
{
   mcu->Send("PORT $FF ;");
   //Wait OK
   if(mcu->Read()!=m_Ok){//Error}
}
 
Этот код будет работать, при условии что другой поток не вмешается.
Вы утверждаете что функция mcu->Read() не нужна в принципе, так вот объясните пожалуйста как будет выглядеть код в вашем варианте, без такой функции.
« Последнее редактирование: Июль 26, 2016, 19:26 от Sphynx » Записан
Bepec
Гость
« Ответ #62 : Июль 26, 2016, 20:57 »

Этот код НЕ будет НОРМАЛЬНО работать. Ибо он тормозит главный поток приложения. Соответственно тот кто пользуется программой врядли будет рад тормозам в 5-7 секунд при каждом нажатии кнопки, вы не находите? Показает язык

Мало того, данный код, как вы верно заметили в этой теме, не масштабируется. Т.е. единовременно может исполняться только 1(один) запрос.

То, что вы написали не годится для работы с интерфейсом. Разве только для "программ для себя", чтобы что то протестировать и забыть.

В общем все грабли вам в этой теме уже отписали вы сами. Можно конечно потратить время и замаскировать асинхронный код под него, но это в разы затратнее, чем уже предложенные способы.

PS в любом случае вам менеджер писать. Простой уже или сложный решать вам.

PPS в моём случае c скриптовым движком будет
Код:
manager_->setScript(" 
send PORT DDR $FF 0  ;
send ADC 5 ;
if result < 100
PORT $FF ;")
Ибо у движка будет голова болеть всё ждать и тому подобное.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #63 : Июль 27, 2016, 10:06 »

В моей реализации внутри MainWindow::on_pushButton_clicked()  будет
Код
C++ (Qt)
mcu->Send("PORT DDR $FF 0 ;");
//Wait 2 Ok
if(mcu->Read()!=m_Ok){//Error}
...
 
Этот код будет работать, при условии что другой поток не вмешается.
Вы утверждаете что функция mcu->Read() не нужна в принципе, так вот объясните пожалуйста как будет выглядеть код в вашем варианте, без такой функции.
Вы находитесь под впечатлением что "почти все уже работает" (нужно только "разрулить потоки"). Но поверьте, "домучить" эту схему не удастся. Хоть с потоками (которые здесь совершенно не нужны), хоть без - в ветках  "Error" возникнут неразрешимые проблемы. Потому что нет соответствия запрос-ответ. Вы посылаете команду и ожидаете ответа(ов) полагая что ответ придет "точно на нее", но в случае таймаута это уже может быть не так.

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

Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #64 : Июль 27, 2016, 12:10 »

1. Вынесите ВСЮ работу с устройством в отдельный поток. В GUI не должно быть никакого обмена данными.
2. Сделайте очередь запросов. Т.е. при нажатии на кнопку устройство не должно опрашиваться непосредственно. Вместо этого должен создаваться запрос и паковаться в очередь. Когда до него "дойдут руки" - тогда уже он должнен быть обработан устройством.

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #65 : Июль 27, 2016, 12:13 »

Не обижайтесь, я правда не понимаю что вы мне пытаетесь разжевать.
Можно конкретней, пусть будут 3 кнопки A B C. По нажатию на кнопки необходимо выполнять определенный сценарий из команд.
Опишите пожалуйста не нижние функции обработчика парсера менеджера и тд. а верхние.
То есть прям конкретно пусть по нажатии кнопки А необходимо:
Установить порт PORT DDR $FF 0 ;
Измерить канал ADC 5 ;
если значение меньше 100 то установить порт PORT $FF ;
Как будет выглядеть эта процедура прям вот конкретно внутри MainWindow::on_pushButton_clicked() 

Прям конкретно:
manager->startComand("MyCommandA");

а менеджер уже пусть разбирает, что такое MyCommandA, и реализует соответвующую логику работы с портами (когда до этого запроса очередь дойдет).
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #66 : Июль 27, 2016, 12:56 »

Прям конкретно:
manager->startComand("MyCommandA");
Ой как конкретно Улыбающийся Какая-то одна строчка хз к чему относится. Правда так или иначе что-то подобное придется городить. Только вот что делать если устройство отвалилось по таймауту - хз. Например
Цитировать
Установить порт PORT DDR $FF 0 ;
Измерить канал ADC 5 ;
И тут ответа не дождались. Ну как-то продолжать работу надо - напр пробуем еще раз то же самое PORT DDR. И тут приходит ответ - но на что?  Может это запоздалый ответ на ADC 5 ?
Записан
Bepec
Гость
« Ответ #67 : Июль 27, 2016, 13:02 »

Это зависит уже от конкретной реализации и требований к менеджеру Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #68 : Июль 27, 2016, 13:13 »

И тут ответа не дождались. Ну как-то продолжать работу надо - напр пробуем еще раз то же самое PORT DDR. И тут приходит ответ - но на что?  Может это запоздалый ответ на ADC 5 ?

Ну, как-то мало смысла слать что-либо еще в девайс, пока ответа не пришло.
А по таймауту можно какой-нибудь ресет послать, если девайс это поддерживает.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #69 : Июль 27, 2016, 13:39 »

Это зависит уже от конкретной реализации и требований к менеджеру Улыбающийся
А тут, стало быть, все "еще не конкретно"?  Улыбающийся Тогда в чем смысл базара на 5 страницах?

Ну, как-то мало смысла слать что-либо еще в девайс, пока ответа не пришло.
А что, есть какой-то выбор? Я его не вижу
А по таймауту можно какой-нибудь ресет послать, если девайс это поддерживает.
Ну вот, говорили "мало смысла", а сами посылаете  Улыбающийся Ну и как опознать ответ пришедший на reset?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #70 : Июль 27, 2016, 14:02 »

Никак, ресет послали - все, что пришло после него - в мусор.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #71 : Июль 27, 2016, 15:06 »

Igors, на 5 страницах тут аргументы в сторону "вам нужен асинхронный менеджер".
А то, что спрашиваете вы про "а что он будет делать [конкретная ситуация, которую вы взяли у себя из головы]" - это незначительные подробности, рождённые вашей фантазией Улыбающийся

PS вот если б вы был ТСсом - да. А так вы выдумываете хрень всякую, не имея обоснований Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #72 : Июль 27, 2016, 15:25 »

Igors, на 5 страницах тут аргументы в сторону "вам нужен асинхронный менеджер".
А то, что спрашиваете вы про "а что он будет делать [конкретная ситуация, которую вы взяли у себя из головы]" - это незначительные подробности, рождённые вашей фантазией Улыбающийся

PS вот если б вы был ТСсом - да. А так вы выдумываете хрень всякую, не имея обоснований Улыбающийся
А Вашей корове лучше помолчать - и в этой теме Вы писали много, но не сказали ничего по существу  Улыбающийся
Записан
Bepec
Гость
« Ответ #73 : Июль 27, 2016, 16:32 »

Что ж это ваше мнение. Однако оно неверно, несправедливо и лицемерно Улыбающийся
Записан
Страниц: 1 ... 3 4 [5]   Вверх
  Печать  
 
Перейти в:  


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