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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Неприятный эффект у прогресс диалога.  (Прочитано 4505 раз)
Hrundel
Гость
« : Май 23, 2014, 12:58 »

Всем привет,

во время экспорта *.obj создаю прогресс диалог. Когда процесс сбрасывает данные вместе - все прекрасно, но как только начинает писать файл на диск, где-то после 5-ти процентов, окно "зависает", в нем появляется надпись "Программа не реагирует" - хотя, процесс успешно продолжается на заднем плане. Но прогресс уже не отображается, конечно. Как результат, по окончании процесса, я получаю файл на выходе, потом прогресс диалог закрывается, и  все работает - но эффект не приятный.
Можно ли это как-то решить?

« Последнее редактирование: Май 23, 2014, 13:26 от Hrundel » Записан
OKTA
Гость
« Ответ #1 : Май 23, 2014, 14:31 »

А все в одном потоке работает?
Записан
Hrundel
Гость
« Ответ #2 : Май 23, 2014, 14:45 »

К сожалению да.
Записан
OKTA
Гость
« Ответ #3 : Май 23, 2014, 16:16 »

Ну, если разделять на потоки лень, то вот
void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static]
Processes all pending events for the calling thread according to the specified flags until there are no more events to process.
You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).
In event you are running a local loop which calls this function continuously, without an event loop, the DeferredDelete events will not be processed. This can affect the behaviour of widgets, e.g. QToolTip, that rely on DeferredDelete events to function properly. An alternative would be to call sendPostedEvents() from within that local loop.
Calling this function processes events only for the calling thread.
Note: This function is thread-safe.
Записан
Hrundel
Гость
« Ответ #4 : Май 23, 2014, 19:53 »

The QCoreApplication class provides an event loop for console Qt applications.
This class is used by non-GUI applications to provide their event loop.

А у меня с GUI

 Грустный
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Май 23, 2014, 19:55 »

QApplication наследник QCoreApplication, т.е. все в силе. Улыбающийся
Записан
Hrundel
Гость
« Ответ #6 : Май 23, 2014, 20:43 »

Не проверил. Лады. Тогда еще раз спасибо. Супер. Буду реализовывать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 24, 2014, 10:04 »

Насколько я помню, модальный QProgressDialog сам перерисовывается (без processEvents), по букварю
Код
C++ (Qt)
QProgressDialog progress("Copying files...", "Abort Copy", 0, numFiles, this);
progress.setWindowModality(Qt::WindowModal);

Ну, если разделять на потоки лень,
Часто в таком разделении нет смысла - все равно у юзера нет разумных действий пока напр запись не окончена.
Записан
Hrundel
Гость
« Ответ #8 : Май 24, 2014, 12:30 »

Да, я его устанавливаю модальным. Все-равно не помогает.
Я тоже был удивлен, и так же рассуждал. Но видимо, не так все просто.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Май 24, 2014, 13:09 »

Да, я его устанавливаю модальным. Все-равно не помогает.
А вы прогресс меняете в диалоге при сохранении данных?
Записан
Hrundel
Гость
« Ответ #10 : Май 24, 2014, 16:10 »

Да, меняю.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Май 24, 2014, 16:14 »

Да, меняю.
Странно, в этот момент прогресс-диалог сам вызывает processEvents.
Записан
Hrundel
Гость
« Ответ #12 : Май 24, 2014, 16:36 »

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


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