Название: Асинхроность в синхроном коде. Отправлено: MaxoBik от Июнь 20, 2015, 05:35 Доброго времени суток, есть некий готовый код, где-то в 3К строк, с довольно смешанным графом исполнения.
Где-то ближе к концу исполнения этого кода, есть парочка функций, в которых есть два различных типа данных в массиве, которые нужно показывать пользователю в GUI и прерывать выполнения до ожидания его реакции(он должен нажать кнопку продолжить). Т.е. взяли элемент с этими данными в цикле внутри этих функций(*тех, что вызываются под конец), обработали, показали в GUI пользователю, он нажал кнопку продолжить или остановить процесс, почти как отладчик. Но весь код написан линейным вызовом функции, а иногда и внутри циклов, пока исполнения не доберется до нужных мне функций. С самого начала код не подразумевал остановки или каких реакций из вне. Так вот - как мне по вашему мнению наиболее правильно поступить? Я вижу тут только два варианта: 1) Начать вызывать весь этот код в отдельном потоке, а в нужных мне функциях вызывать сигнал с этими элементами, потом в этих функциях делать в цикле sleep, с проверкой флага продолжения работы, который появится после нажатия пользователя на кнопку продолжить. Ну и соответственно если есть сигнал отмены - собрать весь мусор и терминаторить поток. 2) Переписать весь код до нужных мне функции в cобытийно-ориентированном стиле, со слотами/сигналами или/и фильтрами событий. Буду признателен, если еще что-то подскажите - как мне еще можно добавить тут асинхронность в изначально синхронном коде да еще и почти под конец его исполнения? Название: Re: Асинхроность в синхроном коде. Отправлено: Igors от Июнь 20, 2015, 09:13 Я вижу тут только два варианта: Это ничем хорошим не кончается, сразу ставьте крест 1) ... Ну и соответственно если есть сигнал отмены - собрать весь мусор и терминаторить поток. 2) Переписать весь код до нужных мне функции в cобытийно-ориентированном стиле, со слотами/сигналами или/и фильтрами событий. Это может не соответствовать логике расчета, т.е. может оказаться совсем непросто разбить его на "событийные порции"Чем не устраивает просто модальный диалог? Если надо обязательно "в отдельном потоке" - вызвать из него модальный диалог через blockingConnection. А еще лучше просто все в главной нитке с QProgressDialog который в нужный момент заменяется на вопрос. Название: Re: Асинхроность в синхроном коде. Отправлено: MaxoBik от Июнь 20, 2015, 16:22 Чем не устраивает просто модальный диалог? К сожалению модальный диалог не подходит - уже есть готовые Model/View для отображения этих данных на форме, пользователь должен видеть, что происходит в том месте кода, после каждой обработки данных. Эти данные ассоциированы с пользовательским вводом в текстовом поле на форме. Можно сказать, что это отладчик - пользователь вводит некие текстовые данные, которые обрабатываются этим кодом, и также он ставит точки остановки на определенных строках своего ввода, которые и есть по сути данные обрабатываемые этими двумя функциями.Если надо обязательно "в отдельном потоке" - вызвать из него модальный диалог через blockingConnection Нет, вообще не обязательно "в отдельном потоке", даже лучше если все это будет происходить в главном потоке. Про поток я упомянул вообще в контексте того, что как-то нужно прервать выполнения до ожидания действий от пользователя, значит блокировать выполнения потока в ожидании действий пользователя.Название: Re: Асинхроность в синхроном коде. Отправлено: Igors от Июнь 20, 2015, 17:33 Про поток я упомянул вообще в контексте того, что как-то нужно прервать выполнения до ожидания действий от пользователя, значит блокировать выполнения потока в ожидании действий пользователя. Тогда так (псевдокод)Код Можно и в отдельном потоке, тогда остановить его напр на семафоре. В любом случае нужно иметь ввиду что расчеты сейчас стоят и ждут, поэтому нельзя их запускать опять, освободить перед закрытием приложения и.т.п. Название: Re: Асинхроность в синхроном коде. Отправлено: MaxoBik от Июнь 20, 2015, 17:58 Про поток я упомянул вообще в контексте того, что как-то нужно прервать выполнения до ожидания действий от пользователя, значит блокировать выполнения потока в ожидании действий пользователя. Тогда так (псевдокод)Код Можно и в отдельном потоке, тогда остановить его напр на семафоре. В любом случае нужно иметь ввиду что расчеты сейчас стоят и ждут, поэтому нельзя их запускать опять, освободить перед закрытием приложения и.т.п. |