У меня есть приложение Windows Forms на C #, которое позволяет управлять камерой и компьютерным зрением. Для всех деталей, которые требуют больше времени для расчета, я использовал отдельные нити. Но есть еще некоторые части, которые находятся в функциях обратного вызова графического интерфейса. Насколько я понимаю, все эти callback-функции выполняются в одном потоке. Есть ли способ узнать, сколько времени этот поток работает или простаивает? Какой процент времени простоя требуется, чтобы графический интерфейс оставался отзывчивым?
Как узнать, сколько времени требуется приложению Windows Forms на C #?
Ответы (2)
Это рекомендуется, чтобы вы не блокировали поток пользовательского интерфейса более чем на 50 мс, иначе это повлияет на отзывчивость пользовательского интерфейса. То есть, два обратных вызова пользовательского интерфейса, поставленные в очередь с Form.BeginInvoke
, выполнение каждого из которых занимает ~ 50 мсек, могут вызвать у пользователя неприятные впечатления от пользовательского интерфейса.
Нет смысла обновлять пользовательский интерфейс чаще, чем пользователь может на это отреагировать (т.е. ~ 24 кадра в секунду). Итак, вам следует ограничить обратные вызовы потока пользовательского интерфейса и дать приоритет событиям ввода пользователя.
Недавно я опубликовал пример того, как это можно сделать:
https://stackoverflow.com/a/21654436/1768303
Для простых задач вы можете использовать секундомер и измерять время вручную. Однако я думаю, вам нужно проверить, что такое профилировщик производительности.
Также - есть небольшие ситуации, в которых вашему графическому интерфейсу требуется такая тяжелая обработка. В большинстве случаев проблема возникает из-за того, что слишком много вычислений помещается в обработчики событий вместо того, чтобы реализовывать их где-то снаружи, а затем обновлять форму по завершении. Это не столько проблема с одним / несколькими потоками, сколько с правильным использованием доступных событий.