나는 100ms마다 무언가를 그려야하는 Form에 PictureBox 컨트롤이 있습니다.Invoke를 사용하여 백그라운드 스레드 작업에 절전 모드로 전환하는 방법
백그라운드 스레드는 루프에서 계산을 수행하고 모든 반복 후에 이벤트를 발생시킵니다.
편집(코멘트에 대한 응답으로) :
world.OnPieceStep += DrawScreen;
: 기본 폼 내부
World world = new World();
void CreateBackgroundThread() {
Thread backgroundThread = new Thread(world.BackgroundWorkerFunction);
backgroundThread.Start();
}
public class World {
void BackgroundWorkerFunction() {
IPiece piece = PieceFactory.Create();
for (int i = 0; i < stepsCount; i++) {
piece.Calculate();
if (OnPieceStep != null) {
OnPieceStep(piece);
}
}
}
}
가 설정 한 핸들러가
a Invoke 래퍼 (draw 할 컨트롤이 UI 스레드에서 생성되기 때문에).
이제void DrawScreen(IPiece piece) {
this.Invoke(new PieceStep(_drawScreen), piece);
}
void _drawScreen(IPiece piece) {
drawer.Draw(world.Board, piece);
}
, 나는 각 반복 후 100ms의 작업을 일시 중지하도록 루프에 대한 싶습니다, 그래서 (100)에 Thread.sleep 추가; 이벤트를 발사하기 전에 :
for (int i = 0; i < stepsCount; i++) {
IPiece piece = Calculate();
if (OnPieceStep != null) {
Thread.Sleep(100);
OnPieceStep(piece);
}
}
이 그러나 PictureBox를마다 100 밀리 새로 고침하지만 루프의 마지막 반복을 그립니다 만 루프 완료 후하지 않습니다.
UI 스레드가 아니라 스레드가 스레드를 일시 중지하지 않아야합니까? 업데이트 : 백그라운드 스레드가 계산되는 동안 앱을 클릭하려고했습니다. 프로그램이 ("응답하지 않음") 차단하므로 Thread.Sleep이 UI 스레드에서 분명히 호출되었습니다. 예상되는 동작입니까, 아니면 스레딩에 문제가 있습니까?
루프 위치는 어디입니까? –
호출 구조를 반영하도록 코드를 편집했습니다. –
그림을 만든 후에 그림 상자를 무효화하고 있습니까? – Simon