| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > D2010: Регулярное обновление строки состояния |
| Автор: grh 29.2.2016, 15:04 |
| Всем привет. Иногда при выполнении долговременных процедур Delphi-приложение "подвисает", и в том числе "подвисает" строка состояния. Что нужно сделать для того, чтобы строка состояния регулярно обновлялась? |
| Автор: Doga 29.2.2016, 15:39 |
| Привет. Application.ProcessMessages; Хотя, если "подвисает" надолго, можно подумать об организации параллельного потока. |
| Автор: dnek 1.3.2016, 15:00 |
| Application.ProcessMessages не так хороша как Вам кажется и далеко не всегда подходит для прорисовки контролов, а в большинстве случаев её вообще не следует использовать. Так что для выполнения "долгоиграющих" процедур наилучший (если не единственный) выход - отдельный поток. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/D2010-Regulyarnoye-obnovleniye-stroki-sostoyaniya-id56d4342bae201554578b4567#findElement_E7045_56d58449ae2015570bdee1d6_0 |
| Автор: Doga 1.3.2016, 20:44 |
| 2dnek: Application.ProcessMessages не так плоха как Вам кажется Иногда она хороша, иногда не очень... Я предложил два варианта. В любом случае, выбор за разработчиком. |
| Автор: dnek 2.3.2016, 08:22 |
| Если использовать Application.ProcessMessages в теле цикла, то сильно грузится проц. Лучше уж тогда ввести какой-нибудь флаг и использовать связку Application.HandleMessage + обработчик Application.OnIdle. А вообще использование Application.ProcessMessages в долгоиграющих процедурах - плохой код (и уже давно). Это было допустимо в Delphi 7, а после (я имею года а не версию) уже считалось некорректным. Старайтесь писать чистый код! Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/D2010-Regulyarnoye-obnovleniye-stroki-sostoyaniya-id56d4342bae201554578b4567#findElement_E7045_56d678a2ae20155403deea8a_0 |
| Автор: ZBugz 3.3.2016, 07:27 | ||
Пусть таймер поставит и каждую секунду обновляет через Application.ProcessMessages и проц не грузится, делов то |
| Автор: Doga 4.3.2016, 00:09 | ||||||
2dnek:
Откуда Вы это взяли? С целью проверки этого утверждения был создан простенький тест. В тесте реализовано 3 режима. В каждом из них производится получение системного времени, преобразование его в строку и её вывод на экран:
1.В первом режиме производится просто получение времени 10 000 000 раз в цикле без возможности обновить время на экране и с эфектом заморозки приложения до окончания работы цикла. Этот режим включён в тест для наглядности. 2.Во втором режиме время опрашиватся в цикле пока не будет нажата кнопка "Стоп". Для обновления используется ProcessMessages. Время на экране обновляеттся своевременно, эфекта заморозки приложения нет. 2.В третем режиме время опрашиватся в цикле параллельного потока пока не будет нажата кнопка "Стоп". Для обновления показаний времени используется Synchronize. Время на экране обновляеттся своевременно, эфекта заморозки нет.
В итоге выяснилось следующее. В первых двух режимах распределение нагрузки по ядрам процессора (у меня 8 виртуальных) выглядит не очень четким, как бы размазанным по всем ядрам, хотя из них можно выделить 2 или 3 с большей нагрузкой и у одного из этих трёх больше чем у двух других. Графики нагрузки в большинстве случаев имеют резкую пилообразную форму, от мнмимума до максимума. Интегральная нагрузка на процессор 13-14%. В третем режиме явно видно, что нагружены только 2 ядра из 8ми. Одно ядро имеет нагрузку ~30% - очевидно главный поток приложения, втрое ядро нагружено на ~ 80% - параллелный поток приложения, занимающийся опросом времени. Графики нагрузки имеют вид практически горизонтальных линий, с небольшим дребезгом. Интегральная нагрузка на процессор 14-16%, т.е. немного больше чем в первых двух режимах. Т.о. отбросив эти 2% (т.е. мою гипотетическюю предвзятость в оценке результатов этого теста), можно сделать вывод, что независимо от способа обновления данных на экране, нагрузка на процессор не меняется. Более того. Одна и та же нагрузка, распределённая по большему количеству ядер, приводит к более равномерному нагреву, снижая локалные перегревы процессора, что положительно сказывается на его работе. Да и вообще, зачем их (процессоры) жалеть? Пусть вкалывают! Они для того и созданы! Будем сюсюкать с ними - так они нам на шею сядут, и пойдут потом всякие СкайНеты и Генезисы! Надеюсь, все мы помним, чем это может закончится... Или не помним |