Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billidean от Март 30, 2016, 19:47



Название: Как на время заблокировать выполнение 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
Пока сделано так:
       в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий.
Иногда это все работает, а иногда не успевают все необходимые действия выполниться (не пойму пока почему так).
Надо понять почему. Если используется только DirectConnection - проблем быть не должно. Если QueuedConnection в том же потоке, то его можно "протолкнуть" с помощью processEvents (см также hasPendingEvents). Вот если в др потоке - придется как-то организовать "ответ" что действие выполнено (или поток завершен).

В общем первое что стоит попробовать - после эмита сигнала вызвать 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(QCloseEvent *) генерю сигнал для отработки всех необходимых действий.
Скорее-всего в closeEvent() забыл вызвать event->ignore().


Название: Re: Как на время заблокировать выполнение close()
Отправлено: billidean от Апрель 05, 2016, 19:51
Спасибо всем за ответы, все сделал, все получилось.