Предотвращение запуска таймеров, когда что-то уже занято (используя Qt) - PullRequest
0 голосов
/ 31 марта 2011

В своем математическом приложении я использую таймеры для регулярного выполнения определенных действий. Эти действия также могут быть настроены моими пользователями. Теперь я не хочу, чтобы эти действия выполнялись, если уже занято другое действие.

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

Проблема в том, что пользователь может выполнить действие множеством различных способов (через меню, щелкнув где-то, через всплывающее меню, с помощью перетаскивания, ...). Что я действительно хочу, так это чтобы таймеры не сработали, если приложение в данный момент не находится в главном цикле событий.

Я приведу более конкретный пример, чтобы прояснить ситуацию:

  • При запуске я создаю таймеры
  • Если таймер отключается, я выполняю некоторые действия, которые на практике могли бы получить доступ почти к каждому биту в структуре данных приложения в мае.
  • Теперь предположим, что пользователь запускает математический алгоритм (через меню, щелкая мышью или перетаскивая элементы на экране, не имеет значения, как он его запустил).
    • Алгоритм будет выполнять множество вычислений (в основном потоке). Поскольку они выполняются в главном потоке, события таймера не исчезнут.
    • Теперь алгоритм показывает окно сообщения (может быть предупреждение или вопрос).
    • Пока окно сообщения открыто, события обрабатываются снова, включая события моего таймера, которые могут выполнять неверные вычисления, поскольку уже запущен другой алгоритм.

Переработка моего приложения, чтобы я переместил логику в отдельный рабочий поток, или добавление проверок ко всем моим действиям в данный момент невозможно. Поэтому, пожалуйста, не предлагайте полностью переделать мое приложение.

То, что я до сих пор пробовал, это следующее:

  • Использование postEvent для отправки события в надежде, что это событие будет выполнено только в главном цикле событий. К сожалению, цикл обработки сообщений также обрабатывает опубликованные события.
  • Использование событий QEvent :: WindowBlocked и QEvent :: WindowUnblocked, чтобы увидеть, когда был открыт модальный диалог. В моей логике таймера-события я могу проверить, находимся ли мы между вызовами QEvent :: WindowBlocked-QEvent :: WindowUnblocked или нет. К сожалению, эти события работают только для модальных диалогов, созданных самим Qt, но не для других диалогов (например, Windows MessageBox или диалогового окна конфигурации принтера системы). Кроме того, этот прием не помог бы, если бы подпрограммами были созданы другие циклы событий.

Что мне действительно нужно для решения моей проблемы, так это простая функция, которая:

  • Если приложение обрабатывает событие в цикле основного события, возвращает true
  • Если приложение обрабатывает событие в другом цикле [sub], оно возвращает false

Альтернативой может быть возвращение уровня, который указывает «глубину» обработанного события.

Есть предложения?

1 Ответ

0 голосов
/ 31 марта 2011

Вы можете подключиться к циклу событий вашего основного потока / приложения, используя QAbstractEventDispatcher.Условно отфильтруйте QTimer-события по состоянию вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...