crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> processEvents() & quit()
igor_bogomolov
  опции профиля:
сообщение 18.5.2009, 11:59
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Привет всем.
Столкнулся с проблемкой, что-то не пойму как решить.

При старте программы, в основном потоке вызывается длительная функция ~40c (она прогружает платы с ADSP). В силу некоторых причин, не хотелось бы выносить ее в дополнительный поток. Для того чтобы Gui не блокировался, периодически вызывается qApp->processEvents().
void ThreadScan::exeLoader(const QString& modules, const QString& loadFile) {
    forever {
        .....
        qApp->processEvents();
    }
}
Есть QAction связанный с QCoreApplication::quit ()
connect(actionExit, SIGNAL(triggered()), qApp, SLOT(quit()));
Так вот, если в процессе выполнения exeLoader высылается quit, программа не завершается, как мне хотелось бы. Завершится только тогда, когда выйдет из exeLoader.

Возможно ли это обойти, не вынося функцию в доп. поток?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 18.5.2009, 12:59
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(kwisp @ 18.5.2009, 13:32) *
в каком месте программы она вызывается, случаем не до входа в основной цикл обработки событий?
нет, конечно. Цикл обработки событий в момент вызова запущен. Другие события обрабатываеются. Не обрабатывается только выход из программы. В асистенте есть замечание по этому поводу. Можно ли это обойти?

Цитата(kwisp @ 18.5.2009, 13:38) *
вот это еще не понятно, высылается вроде бы triggered
т.е. соединение срабатывает во время а программа закрывается только после завершения функции exeLoader
Ты все правильно понял. Это я просто так сформулировал.

К примеру, есть два коннекта. aboutQt() отробатывает в процессе выполнения exeLoader, quit() - нет.
    connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
    connect(actionExit, SIGNAL(triggered()), qApp, SLOT(quit()));


В книге Бланшета есть такой абзац
Цитата
One danger with this approach is that the user might close the main window while the application is still saving, or even click File|Save a second time, resulting in undefined behavior. The easiest solution to this problem is to replace
qApp->processEvents();
with
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
Мне же, как раз таки и надо закрыть окно во время выполнения, но этого не происходит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.12.2024, 17:38