2009-05-16 2 views
3

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

ответ

4

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

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

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

+0

+1 для рабочего подхода; Я второй совет Джона не использовать DoEvents –

2

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

Смежные вопросы