LINUX.ORG.RU

Как определить, запущен ли основной цикл QApplication::exec() или еще нет?

 , ,


0

1

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

У класса QApplication есть метод exec(), но нет метода типа isRunning().

По какому признаку можно понять, что объект приложения создан и запущен?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Итить.. Мой либастрал сегодня в порядке чуял я в соседнем треде ))

Да просто:

guiEventLoopIsRunning = true;
app.exec();

Ну как оно у тебя там наследуется, вот и оберни экзек родителя в свой и там устанавливай этот буль.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)

В доке есть такое:

bool QCoreApplication::startingUp()

Returns true if an application object has not been created yet; otherwise returns false.

wolph ★★
()
Ответ на: комментарий от wolph

Создание и запуск основного цикла - это вроде как разные вещи, разве нет?

Xintrea ★★★★★
() автор топика

Лол я знаю, но не скажу :-)

anonymous
()
Ответ на: комментарий от deep-purple

Ну как оно у тебя там наследуется, вот и оберни экзек родителя в свой и там устанавливай этот буль.

Ну я так и сделал. Но в свете того, что использовать наследника QApplication с дополнительными полями вместо кучки синглтонов - это моветон, то хотелось бы узнать как сделать без переопределения метода exec().

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Из кода видно, что тебя интересует QCoreApplicationPrivate::in_exec, но он нигде не выдаётся наружу (и, походу, используется только для ручного дебага).

vzzo ★★★
()
Ответ на: комментарий от Xintrea

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

app.setproperty("started", true);
app.exec().

wolph ★★
()
Ответ на: комментарий от wolph

Не соглашусь. Тут уже вопрос интрефейса. Так будет топорная и понятная обертка геттер, а в твоем случае непонятные js-style сеттеры, геттеры. Можно и их использовать, но их же следует обернуть в «топорные» методы в угоду понятности и однозначности.

deep-purple ★★★★★
()
Ответ на: комментарий от Xintrea

Схренали моветон?

Но это так — первая реакция. На деле же, я хз что у тебя там за архитектура и почему тебе стало удобнее в кучу синглтонов. У меня у самого тут в работе «раскоряка» такая, что без слёз не взглянешь. Но в твоем случае, насколько я вижу сейчас, приватный буль и геттер статуса выглядит вполне кавайно.

deep-purple ★★★★★
()
Ответ на: комментарий от XMs

Щщи, возможно как вариант. Но снова это в итоге просто обертка над неким булевым статусом «аглы» или «не аглы».

deep-purple ★★★★★
()

Два извечных русских вопроса как и назачем.

pon4ik ★★★★★
()
Ответ на: комментарий от deep-purple

Зато ничего создавать не надо. Но вообще ТС не написал, зачем ему это надо, может, другие решения подойдут лучше

XMs ★★★★★
()
Ответ на: комментарий от XMs

А specified ли behavior у соединения сигналов и слотов, до создания очереди в которой они разгребаются?

Хотя, будь я автором QCoreApplication таки создавал бы очередь при создании объекта.

pon4ik ★★★★★
()

В общем случае определить нельзя. Это как курит ли человек после того как потушил сигарету? Вроде бы как уже и нет, но вообще да. exec() это один из способов обработать накопившиеся события, он может быть запущен один раз, несколько, а может и не быть запущен вовсе. В каждый конкретный момент в главном потоке нельзя понять как и когда твоё событие будет обработано в следующий раз. Это не RAII-объект со своим циклом жизни. Более того, циклы могут быть вложенными и даже создаваться временно, как, например, делает QDialog, запущенный до QApplication::exec(). Другими словами, нужно понять конкретную задачу и решить её вручную, к примеру, взводом какого-нибудь флага, который будет иметь своё целевое назначение, а не абстрактное запущен ли главный цикл.

Dendy ★★★★★
()
Ответ на: комментарий от pon4ik

Связи сигнал-слот легко объявляются/добавляются и «запоминаются» еще до начала ивент-лупа. Но, если объявленный сигнал заэмитить до начала лупа, то луп его не увидит.

deep-purple ★★★★★
()
Ответ на: комментарий от pon4ik

до создания очереди в которой они разгребаются?

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

XMs ★★★★★
()
Ответ на: комментарий от deep-purple

А точно очередь создаётся при создании цикла(читай при вызове exec)?

Непонятно зачем так делать, кроме как добиться потери поставленных в очередь сигналов.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Ну так запилили авторы, что теперь, не писать на культях чтоли? ))

deep-purple ★★★★★
()
Ответ на: комментарий от Xintrea

использовать наследника QApplication с дополнительными полями вместо кучки синглтонов - это моветон

Все как раз с точностью до наоборот.

trex6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.