Как форсировать обработку событий внутри рекурсивной функции? - PullRequest
3 голосов
/ 16 мая 2009

Я пишу заставку на C #, которая медленно рисует треугольник Серпинского. Я использую Thread.Sleep внутри рекурсивной функции, чтобы замедлить рисование. Но мне нужен способ, позволяющий пользователю выйти, перемещая мышь, нажимая клавишу и т. Д. Поскольку моя функция рисования вызывается из обработчика событий Paint формы, события мыши и клавиатуры обрабатываются только после полного нарисован треугольник, что может занять довольно много времени. Как я могу заставить форму обрабатывать события во время работы рекурсивной функции? (И как избежать бесконечного цикла, вызванного вызовом события рисования, которое вызывает функцию рисования, которая вызывает обработку события, которое вызывает событие рисования и т. Д .?)

Ответы [ 2 ]

4 голосов
/ 16 мая 2009

Ну, вы можете использовать Application.DoEvents - но я не уверен, что посоветую это. Вы можете легко столкнуться с проблемами повторного входа, особенно в случае Paint.

Похоже, что вся настоящая работа действительно должна быть выполнена в потоке пользовательского интерфейса, если вы обрабатываете событие Paint - это правильно?

Альтернативой может быть создание Bitmap и рисование на нем вместо использования обработчика событий Paint. Вы можете сделать это в фоновом потоке, периодически создавая новое изображение, копируя изображение, которое вы уже нарисовали на нем, рисуя следующий слой (или что-то еще), а затем маршируя в поток пользовательского интерфейса, чтобы использовать изображение в пользовательском интерфейсе. Это оставит основной поток пользовательского интерфейса свободным для обработки событий. Вам вообще не нужно обрабатывать событие Paint - просто есть PictureBox, который вы используете для отображения «изображения до сих пор». Не забудьте избавиться от старых растровых изображений, когда закончите с ними, чтобы избежать проблем с памятью.

2 голосов
/ 16 мая 2009

Вы можете использовать растровое изображение backbuffer, которое вы вычисляете / рисуете когда хотите, и просто отображаете его в событии Paint Вычисление может быть сделано в отдельном потоке.

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