2009-05-16 2 views
3

나는 천천히 Sierpinski 삼각형을 그려주는 C#의 스크린 세이버를 작성하고 있습니다. 재귀 함수 내에서 Thread.Sleep을 사용하여 드로잉 속도를 늦 춥니 다. 하지만, 사용자가 마우스를 움직이거나 키를 누르는 등의 방법으로 종료 할 수 있어야합니다. 양식의 Paint 이벤트 처리기 내에서 그리기 기능이 호출되므로 마우스 및 키보드 이벤트는 전체 삼각형이 처리 된 후에 만 ​​처리됩니다. 그려서 꽤 오랜 시간이 걸릴 수 있습니다. 어떻게 재귀 함수가 실행되는 동안 이벤트를 처리하도록 폼을 강제로 할 수 있습니까? (페인트 이벤트 등을 호출하는 이벤트 핸들링을 강제하는 드로잉 함수를 호출하는 페인트 이벤트를 호출하여 발생하는 무한 루프를 피하는 방법)재귀 함수 내부에서 이벤트 처리를 강제 수행하는 방법?

답변

4

글쎄 너 수 있습니다 사용 Application.DoEvents -하지만 나는 그것을 권하고 싶지 않아요. 특히 Paint 이벤트에서 재진입 문제로 쉽게 끝날 수 있습니다.

Paint 이벤트를 처리하는 경우 실제로 UI 스레드에서 수행해야하는 모든 작업이 들리는 것 같습니다. 맞습니까?

대신 Paint 이벤트 처리기를 사용하는 대신 Bitmap을 만들고 그 위에 그릴 수 있습니다. 백그라운드 스레드에서이 작업을 수행 할 수 있습니다. 주기적으로 새 이미지를 작성하고, 지금까지 그려진 이미지를 복사 한 다음 다음 레이어 (또는 그 이상)를 그린 다음 UI 스레드에서 마샬링하여 UI에서 이미지를 사용할 수 있습니다. 이렇게하면 이벤트 핸들링을 위해 기본 UI 스레드를 자유롭게 유지할 수 있습니다. Paint 이벤트를 처리 할 필요가 없습니다. "지금까지의 이미지"를 표시하는 데 사용하는 PictureBox 만 있으면됩니다. 메모리 문제를 피하기 위해 오래된 비트 맵을 처리하는 것을 잊어 버리지 마십시오.

+0

근로자 접근법에 +1; 나는 DoEvents를 사용하지 말라고 두 번째로 조언했다. –

2

언제든지 계산/드로잉 할 수있는 backbuffer 비트 맵을 사용할 수 있습니다 Paint 이벤트에 표시하면됩니다. 계산은 별도의 스레드에서 수행 할 수 있습니다.