Фоновая обработка в потоке пользовательского интерфейса? (Winforms) - PullRequest
0 голосов
/ 11 марта 2010

Есть ли (или у вас есть собственный) предпочтительный способ выполнения фоновой обработки срезами в потоке пользовательского интерфейса в Windows Forms? Как и OnIdle () в MFC?

В нативном программировании Windows вы можете сделать это для создания собственного цикла сообщений, но Application.Run () не дает нам доступа к циклу сообщений.

Событие Application.Idle не позволяет нам повторно запускать его.

Полагаю, вы могли бы вызвать нативный PostMessage () с помощью P / Invoke (поскольку нет управляемой версии), чтобы опубликовать личное сообщение "WM_IDLE" и переопределить WndProc (), чтобы его перехватить. Я не знаю, как это будет ладить с Application.Run ().

До сих пор я использовал для этого короткий таймер, но, боюсь, я теряю циклы сна, тем более что фактическое разрешение таймера грубее, чем номинальный минимум 1 мс.

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Лучший вариант, который я видел, - это использование модифицированной версии Managed DirectX Render Loop, разработанной Томом Миллером . Добавив вызов к Thread.Sleep() внутри цикла рендеринга, вы можете значительно снизить нагрузку на ваш процессор.

Для этого требуется вызов P / Invoke, чтобы отследить, что приложение по-прежнему бездействует, но пока оно бездействует, вы можете создать «таймер», который будет непрерывно срабатывать во время фаз простоя, и использовать его для обработки.

Как говорится, в современных системах у вас почти всегда есть дополнительные ядра. Я бы посоветовал просто выполнить обработку в фоновом потоке.

0 голосов
/ 11 марта 2010

Я подумал о своем собственном возможном ответе, вдохновленном разговором Рида о многопоточности.У меня может быть способ перезапустить Application.Idle:

Создать скрытую форму, назовем ее formRetrigger.

В Application.Idle запустите мой метод Retrigger () в потоке пула потоков.

Retrigger () вызывает formRetrigger.InvokeOnClick () (или любой другой метод "Control.Invoke").Я ожидаю, что это приведет к запуску другого сообщения через очередь приложения, что приведет к повторному запуску бездействия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...