Я пишу скринсейвер на C#, который медленно рисует треугольник Серпинского. Я использую Thread.Sleep
внутри рекурсивной функции для замедления рисования. Но мне нужно, чтобы пользователь мог выйти, перемещая мышь, нажимая клавишу и т. Д. Когда моя функция рисования вызывается из обработчика события Paint
формы, события мыши и клавиатуры обрабатываются только после того, как весь треугольник который может занять некоторое время. Как заставить форму обрабатывать события во время работы рекурсивной функции? (И как избежать бесконечного цикла, вызванного вызовом события рисования, которое вызывает функцию рисования, которая вызывает обработку события, которая вызывает событие рисования и т. Д.?)Как принудительно обрабатывать события внутри рекурсивной функции?
ответ
Хорошо, вы можете использовать Application.DoEvents
- но я не уверен, что я посоветую. Вы легко можете столкнуться с проблемами повторного входа, особенно в мероприятии Paint
.
Похоже, что вся настоящая работа действительно должна выполняться в потоке пользовательского интерфейса, если вы обрабатываете событие Paint
- это правильно?
Альтернативой было бы создать Bitmap
и нарисовать на нем вместо использования обработчика событий Paint
. Вы можете сделать это в фоновом потоке, периодически создавая новое изображение, копируя изображение, которое вы нарисовали до сих пор, нарисовывая следующий слой (или что-то еще), а затем сортируя по потоку пользовательского интерфейса, чтобы использовать изображение в пользовательском интерфейсе. Это позволит сохранить поток основного пользовательского интерфейса для обработки событий. Вам вообще не нужно было бы обрабатывать событие Paint
- просто у вас есть PictureBox
, который вы используете для отображения «изображения до сих пор». Не забывайте удалять старые растровые изображения, когда вы закончите с ними, чтобы избежать проблем с памятью.
Вы можете использовать растровое изображение backbuffer, которое вы вычисляете/рисуете, когда захотите и просто покажите его в событии Paint
. Вычисление может быть выполнено в отдельном потоке.
- 1. Обещания внутри рекурсивной функции
- 2. Исчисление внутри рекурсивной функции
- 3. Как принудительно обрабатывать сообщения внутри потока?
- 4. Counting внутри рекурсивной функции
- 5. StackOverflowException внутри рекурсивной функции
- 6. Область внутри рекурсивной функции?
- 7. Счетчик внутри рекурсивной функции
- 8. Вызов рекурсивной функции внутри цикла
- 9. Создание потока внутри рекурсивной функции
- 10. Асинхронный вызов внутри рекурсивной функции
- 11. Как создать счетчик внутри рекурсивной функции
- 12. Как обрабатывать функцию события внутри атрибута объекта?
- 13. Как принудительно обрабатывать содержимое файла?
- 14. Как дождаться события внутри функции?
- 15. массив должен быть внутри рекурсивной функции
- 16. Запоминающая глубина рекурсивной функции внутри класса
- 17. Javascript SetTimeout не работает внутри рекурсивной функции
- 18. Что происходит внутри этой рекурсивной функции?
- 19. jQuery анимация внутри рекурсивной функции очень медленная
- 20. время внутри рекурсивной функции в OPENGL
- 21. Ошибка подключения PDO внутри рекурсивной функции PHP
- 22. Использование сна внутри рекурсивной функции setTimeout
- 23. jQuery: текст не обновляется внутри рекурсивной функции
- 24. System.out.println() не работает внутри рекурсивной функции
- 25. Выполняют большие привязки внутри рекурсивной функции Clojure?
- 26. Как обрабатывать события UserControl
- 27. как считать в рекурсивной функции?
- 28. питон: как относиться к классу внутри него (как рекурсивной функции)
- 29. jQuery обрабатывать события мыши внутри IFRAME
- 30. объектов JavaScript рекурсивной функции
+1 для рабочего подхода; Я второй совет Джона не использовать DoEvents –