Russian Qt Forum

Qt => Общие вопросы => Тема начата: Hrundel от Май 23, 2014, 12:58



Название: Неприятный эффект у прогресс диалога.
Отправлено: Hrundel от Май 23, 2014, 12:58
Всем привет,

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



Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: OKTA от Май 23, 2014, 14:31
А все в одном потоке работает?


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Hrundel от Май 23, 2014, 14:45
К сожалению да.


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: OKTA от Май 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.


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Hrundel от Май 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

 :(


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Old от Май 23, 2014, 19:55
QApplication наследник QCoreApplication, т.е. все в силе. :)


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Hrundel от Май 23, 2014, 20:43
Не проверил. Лады. Тогда еще раз спасибо. Супер. Буду реализовывать.


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

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


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Hrundel от Май 24, 2014, 12:30
Да, я его устанавливаю модальным. Все-равно не помогает.
Я тоже был удивлен, и так же рассуждал. Но видимо, не так все просто.


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Old от Май 24, 2014, 13:09
Да, я его устанавливаю модальным. Все-равно не помогает.
А вы прогресс меняете в диалоге при сохранении данных?


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Hrundel от Май 24, 2014, 16:10
Да, меняю.


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Old от Май 24, 2014, 16:14
Да, меняю.
Странно, в этот момент прогресс-диалог сам вызывает processEvents.


Название: Re: Неприятный эффект у прогресс диалога.
Отправлено: Hrundel от Май 24, 2014, 16:36
Вычистил весь дебаг, перекомпилировал - заработало.
Глюк какой-то был.