Название: Как на время заблокировать выполнение close() Отправлено: billidean от Март 30, 2016, 19:47 Добрый день всем.
При закрытии окна необходимо выполнить некоторые действия (завершит внешние обмены, выдать внешние команды девайсам,...) Пока сделано так: в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий. Иногда это все работает, а иногда не успевают все необходимые действия выполниться (не пойму пока почему так). Так вот хочется заблокировать выполнение закрытия до завершения всех манипуляций, а потом уже запустить процесс закрытия. Подскажите как лучше это сделать. Название: Re: Как на время заблокировать выполнение close() Отправлено: Vamireh от Март 30, 2016, 20:07 Ну, например, добавить признак готовности к выходу. Если он ложный - вызвать event->ignore(); А потом когда надо установить его в true и просто закрыть
А вообще можно вызывать слоты с блокировкой выполнения. Точно уже не помню как, через DirectConnection соединить нужно, кажется. Название: Re: Как на время заблокировать выполнение close() Отправлено: Bepec от Март 30, 2016, 21:51 Ошибки
1) сигналы не отправляются мгновенно. Они лишь передаются менеджеру и он уже их распихивает как надо. 2) отправка сигнала не равняется выполнению функции. Если проще сказать, работа сигнал-слотовой системы асинхронна. Решение - в closeEvent вызываем собственноручно написанный слот-функцию "quit". В котором мы проверяем, всё ли мы сделали. - Если не всё - отсылаем нужные сигналы и выходим из ф-ции. А вызываемые слоты должны опять вызывать ф-цию выхода. - Если выполнено всё - осуществлять завершение работы программы. Ну и везде где можно закрыть программу, поставить игнор и выходить исключительно через вашу функцию quit. Название: Re: Как на время заблокировать выполнение close() Отправлено: Igors от Март 31, 2016, 04:12 Пока сделано так: Надо понять почему. Если используется только DirectConnection - проблем быть не должно. Если QueuedConnection в том же потоке, то его можно "протолкнуть" с помощью processEvents (см также hasPendingEvents). Вот если в др потоке - придется как-то организовать "ответ" что действие выполнено (или поток завершен). в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий. Иногда это все работает, а иногда не успевают все необходимые действия выполниться (не пойму пока почему так). В общем первое что стоит попробовать - после эмита сигнала вызвать processEvents Решение - в closeEvent вызываем собственноручно написанный слот-функцию "quit". В котором мы проверяем, всё ли мы сделали. Основная идея слот/сигнал "я испустил а кому надо разберется", что позволяет испускающему не знать разбирающихся. А если сами "все проверяем" - смысла в слот/сигнал никакого.Название: Re: Как на время заблокировать выполнение close() Отправлено: Bepec от Март 31, 2016, 07:11 to Igors: тут частный случай - нам необходимо проверять выполнение действий. И они должны сработать в любом случае.
Название: Re: Как на время заблокировать выполнение close() Отправлено: billidean от Март 31, 2016, 08:17 Спасибо за ответы.
Скоро буду тестить новый алгоритм закрытия. Название: Re: Как на время заблокировать выполнение close() Отправлено: Day от Апрель 02, 2016, 19:31 Пока сделано так: в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий. Имхо, никаких сигналов генерить не надо, а просто вызывать слоты, как функции, напрямую.Если это нужно, то слот может разобраться, вызван ли он через connect или напрямую по sender==0 Название: Re: Как на время заблокировать выполнение close() Отправлено: GreatSnake от Апрель 04, 2016, 12:47 Пока сделано так: Скорее-всего в closeEvent() забыл вызвать event->ignore().в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий. Название: Re: Как на время заблокировать выполнение close() Отправлено: billidean от Апрель 05, 2016, 19:51 Спасибо всем за ответы, все сделал, все получилось.
|