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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как на время заблокировать выполнение close()  (Прочитано 4632 раз)
billidean
Гость
« : Март 30, 2016, 19:47 »

Добрый день всем.

При закрытии окна необходимо выполнить некоторые действия (завершит внешние обмены, выдать внешние команды девайсам,...)
Пока сделано так:
       в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий.
Иногда это все работает, а иногда не успевают все необходимые действия выполниться (не пойму пока почему так).

Так вот хочется заблокировать выполнение закрытия до завершения всех манипуляций, а потом уже запустить процесс закрытия.

Подскажите как лучше это сделать.
Записан
Vamireh
Гость
« Ответ #1 : Март 30, 2016, 20:07 »

Ну, например, добавить признак готовности к выходу. Если он ложный -  вызвать event->ignore(); А потом когда надо установить его в true и просто закрыть

А вообще можно вызывать слоты с блокировкой выполнения. Точно уже не помню как, через DirectConnection соединить нужно, кажется.
« Последнее редактирование: Март 30, 2016, 20:11 от Vamireh » Записан
Bepec
Гость
« Ответ #2 : Март 30, 2016, 21:51 »

Ошибки
1) сигналы не отправляются мгновенно. Они лишь передаются менеджеру и он уже их распихивает как надо.
2) отправка сигнала не равняется выполнению функции. Если проще сказать, работа сигнал-слотовой системы асинхронна.

Решение - в closeEvent вызываем собственноручно написанный слот-функцию "quit". В котором мы проверяем, всё ли мы сделали.
-      Если не всё - отсылаем нужные сигналы и выходим из ф-ции. А вызываемые слоты должны опять вызывать ф-цию выхода.
-      Если выполнено всё - осуществлять завершение работы программы.

Ну и везде где можно закрыть программу, поставить игнор и выходить исключительно через вашу функцию quit.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 31, 2016, 04:12 »

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

В общем первое что стоит попробовать - после эмита сигнала вызвать processEvents

Решение - в closeEvent вызываем собственноручно написанный слот-функцию "quit". В котором мы проверяем, всё ли мы сделали.
Основная идея слот/сигнал "я испустил а кому надо разберется", что позволяет испускающему не знать разбирающихся. А если сами "все проверяем" - смысла в слот/сигнал никакого.
Записан
Bepec
Гость
« Ответ #4 : Март 31, 2016, 07:11 »

to Igors: тут частный случай - нам необходимо проверять выполнение действий. И они должны сработать в любом случае.
Записан
billidean
Гость
« Ответ #5 : Март 31, 2016, 08:17 »

Спасибо за ответы.
Скоро буду тестить новый алгоритм закрытия.
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #6 : Апрель 02, 2016, 19:31 »

Пока сделано так: в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий.
Имхо, никаких сигналов генерить не надо, а просто вызывать слоты, как функции, напрямую.
Если это нужно, то слот может разобраться, вызван ли он через connect или напрямую по sender==0
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Апрель 04, 2016, 12:47 »

Пока сделано так:
       в обработчике closeEvent(QCloseEvent *) генерю сигнал для отработки всех необходимых действий.
Скорее-всего в closeEvent() забыл вызвать event->ignore().
Записан

Qt 5.11/4.8.7 (X11/Win)
billidean
Гость
« Ответ #8 : Апрель 05, 2016, 19:51 »

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


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