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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Асинхроность в синхроном коде.  (Прочитано 4223 раз)
MaxoBik
Гость
« : Июнь 20, 2015, 05:35 »

Доброго времени суток, есть некий готовый код, где-то в 3К строк, с довольно смешанным графом исполнения.
Где-то ближе к концу исполнения этого кода, есть парочка функций, в которых есть два различных типа данных в массиве, которые нужно показывать пользователю в GUI и прерывать выполнения до ожидания его реакции(он должен нажать кнопку продолжить). Т.е. взяли элемент с этими данными в цикле внутри этих функций(*тех, что вызываются под конец), обработали, показали в GUI пользователю, он нажал кнопку продолжить или остановить процесс, почти как отладчик. Но весь код написан линейным вызовом функции, а иногда и внутри циклов, пока исполнения не доберется до нужных мне функций. С самого начала код не подразумевал остановки или каких реакций из вне. Так вот - как мне по вашему мнению наиболее правильно поступить?
Я вижу тут только два варианта:
1) Начать вызывать весь этот код в отдельном потоке, а в нужных мне функциях вызывать сигнал с этими элементами, потом в этих функциях делать в цикле sleep, с проверкой флага продолжения работы, который появится после нажатия пользователя на кнопку продолжить. Ну и соответственно если есть сигнал отмены - собрать весь мусор и терминаторить поток.
2) Переписать весь код до нужных мне функции в cобытийно-ориентированном стиле, со слотами/сигналами или/и фильтрами событий.
Буду признателен, если еще что-то подскажите - как мне еще можно добавить тут асинхронность в изначально синхронном коде да еще и почти под конец его исполнения?
« Последнее редактирование: Июнь 20, 2015, 05:44 от MaxoBik » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июнь 20, 2015, 09:13 »

Я вижу тут только два варианта:
1) ... Ну и соответственно если есть сигнал отмены - собрать весь мусор и терминаторить поток.
Это ничем хорошим не кончается, сразу ставьте крест

2) Переписать весь код до нужных мне функции в cобытийно-ориентированном стиле, со слотами/сигналами или/и фильтрами событий.
Это может не соответствовать логике расчета, т.е. может оказаться совсем непросто разбить его на "событийные порции"

Чем не устраивает просто модальный диалог? Если надо обязательно "в отдельном потоке" - вызвать из него модальный диалог через blockingConnection. А еще лучше просто все в главной нитке с QProgressDialog который в нужный момент заменяется на вопрос.
Записан
MaxoBik
Гость
« Ответ #2 : Июнь 20, 2015, 16:22 »

Чем не устраивает просто модальный диалог?
К сожалению модальный диалог не подходит - уже есть готовые Model/View для отображения этих данных на форме, пользователь должен видеть, что происходит в том месте кода, после каждой обработки данных. Эти данные ассоциированы с пользовательским вводом в текстовом поле на форме. Можно сказать, что это отладчик - пользователь вводит некие текстовые данные, которые обрабатываются этим кодом, и также он ставит точки остановки на определенных строках своего ввода, которые и есть по сути данные обрабатываемые этими двумя функциями.
Если надо обязательно "в отдельном потоке" - вызвать из него модальный диалог через blockingConnection
Нет, вообще не обязательно "в отдельном потоке", даже лучше если все это будет происходить в главном потоке. Про поток я упомянул вообще в контексте того, что как-то нужно прервать выполнения до ожидания действий от пользователя, значит блокировать выполнения потока в ожидании действий пользователя.
« Последнее редактирование: Июнь 20, 2015, 16:51 от MaxoBik » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 20, 2015, 17:33 »

Про поток я упомянул вообще в контексте того, что как-то нужно прервать выполнения до ожидания действий от пользователя, значит блокировать выполнения потока в ожидании действий пользователя.
Тогда так (псевдокод)
Код
C++ (Qt)
...считаем...
while (!reply) {
qApp->processEvents(QEventLoop::WaitForMoreEvents);
}
switch (reply) {
 case reply_Continue:
  ...
  break;
 case reply_Abort:
  ...
}
 
Можно и в отдельном потоке, тогда остановить его напр на семафоре. В любом случае нужно иметь ввиду что расчеты сейчас стоят и ждут, поэтому нельзя их запускать опять, освободить перед закрытием приложения и.т.п.
Записан
MaxoBik
Гость
« Ответ #4 : Июнь 20, 2015, 17:58 »

Про поток я упомянул вообще в контексте того, что как-то нужно прервать выполнения до ожидания действий от пользователя, значит блокировать выполнения потока в ожидании действий пользователя.
Тогда так (псевдокод)
Код
C++ (Qt)
...считаем...
while (!reply) {
qApp->processEvents(QEventLoop::WaitForMoreEvents);
}
switch (reply) {
 case reply_Continue:
  ...
  break;
 case reply_Abort:
  ...
}
 
Можно и в отдельном потоке, тогда остановить его напр на семафоре. В любом случае нужно иметь ввиду что расчеты сейчас стоят и ждут, поэтому нельзя их запускать опять, освободить перед закрытием приложения и.т.п.

Спасибо за подсказку, приблизительно то что мне и надо было.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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