
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.16] |
![]() |
|
![]() |
|
|
Здравствуйте!
Метод: ![]() ![]() void MainWindow::Start() { lblInfo->clear(); lblInfo->setText(""); QThread::sleep(10); QString fileNameSave = lblFileNameResults->text(); if(fileNameSave.isEmpty()) { GetFileName(true); } fileNameSave = lblFileNameResults->text(); lblInfo->setText("Программа завершилась!"); } Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
Все дело в QThread::sleep(10); Это конструкция не только усыпляет поток, но и приостанавливает обработку событий в главном потоке (читай "GUI потоке"), в том числе и обработку событий отрисовки. Лучше использовать обработки в других потоках и связывать эти потоки сигналами. Но если уж хочется сделать в основном потоке - можно использовать неблокирующий события вариант задержки:
![]() ![]() QEventLoop Loop; QTimer Timer; connect(&Timer, &QTimer::timeout, &Loop, &QEventLoop::quit); Timer.setSingleShot(true); Timer.start(1000); Loop.exec(); Варианты задержек. |
Сообщ.
#3
,
|
|
|
Цитата Majestio @ По-моему, дело не в этом. Я убрал задержку:Все дело в QThread::sleep(10) ![]() ![]() void MainWindow::Start() { lblInfo->clear(); lblInfo->setText(""); QString fileNameSave = lblFileNameResults->text(); if(fileNameSave.isEmpty()) { GetFileName(true); } fileNameSave = lblFileNameResults->text(); lblInfo->setText("Программа завершилась!"); } Добавлено Я тормоз. Все обновляется, задержка не нужна. |
Сообщ.
#4
,
|
|
|
Повторюсь - можно и с задержкой, но только по моему варианту. Ну а так, конечно, если задержка не нужна для чего-то другого, то лучше без нее.
|
Сообщ.
#5
,
|
|
|
Спасибо, понятно.
|
Сообщ.
#6
,
|
|
|
Цитата tumanovalex @ Спасибо, понятно. И на будущее - лови лайфхак ... Твои программы могут как угодно быстро рассчитывать и обсчитывать твои данные. Но это совсем не значит, что на каждое изменение ты должен перерисовывать значение соответствующего "контрола". Нет, конечно можешь - но будешь просто "сжигать" впустую нагрузку на CPU. Для человеческого восприятия наличия изменений - вполне достаточно не более 4 раз в секунду изменять визуально значение какой-то величины в интерфейсе. И это нужно делать, вернее ограничивать, в обрабатывающем потоке. Т.е. там нужно что-то обрабатывать и слать сигнал основному потоку только тогда, когда предыдущий сигнал был отослан 0.25 сек или более тому назад. Тогда, и только тогда, твоя прога будет работать по фэн-шую. И с такой прогой можно будет даже спокойно ехать в КНДР, с полной уверенностью, что тебя там за нее не расстреляют! ![]() |
Сообщ.
#7
,
|
|
|
Цитата Majestio @ Спасибо, в будущем обязательно буду это учитывать. Для человеческого восприятия наличия изменений - вполне достаточно не более 4 раз в секунду изменять визуально значение какой-то величины в интерфейсе. |
Сообщ.
#8
,
|
|
|
Когда-то, ещё во времена зелёных текстовых терминалов, подключенных к мэйнфреймам по интерфейсу "токовая петля" со скоростью передачи, не превышающей 2400 бит/с, было произведено исследование, как человек воспринимает время между подачей команды и ответом программы.
Если время было меньше половины секунды, оператор начинал нервничать: он ещё не успел команду подать, а ответ уже на экране. А не выдаёт ли программа какую-нибудь чушь? Если ничего не присходило больше 5 с, оператор начинал сомневаться, а не зависла ли программа. Если задержка превышала 15 с, оператор уже не сомневался, а был уверен - программа висит. Так что, если выполнение действия будет занимать меньше 5 с, можно вообще ничего не выводить на экран до его завершения - пользователь всё равно не успеет обратить внимание. Если больше, достаточно обновлять текстовые сообщения раз в полсекунды-секунду, индикаторы, наверно от 4 до 10 раз в секунду. Чаще обновлять нет смысла. Следует также избегать медленных прогресс-баров, если на добавление очередного пикселя уходит по полминуты, то такой прогресс-бар показывает только, какая часть уже сделана, но никак не демонстрирует, что процесс ещё движется. В таком случае прогресс-бар имеет смысл сопроводить какой-нибудь инфорнмацией, меняющейся хотя-бы раз в несколько секунд. Оценка оставшегося времени, например. Хотя в Хроме, даже это сделали через одно место. Например, он сообщает до окончания загрузки "осталось 3 часа", и через час меняет сообщение на "осталось 2 часа", причём 2 часа для него это от 2 часов, до почти 3 часов. |
Сообщ.
#9
,
|
|
|
Как-то раз я решил померить, сколько времени требуется
для полной перерисовки экрана 1920x1080, 32 бита. Компьютер был бюджетный, ~2013 года выпуска. Потребовалось меньше 1 [мс]. |
Сообщ.
#10
,
|
|
|
amkЫукпШ Спасибо за пояснения
|