2011-01-20 5 views
1

매우 짧은 시간 (50ms) 동안 지정된 위치 (winapi의 GetPixel 사용)에서 색상을 확인하는 기능이 있습니다. 지금은 폼에서 타이머를 사용하여 50ms마다 해당 함수를 호출하지만 내 응용 프로그램은 지옥처럼 얼어 버립니다.스레드의 CheckPixelColor

사용자 인터페이스가 고정되지 않도록 무한대 반복되는 별도의 스레드에서 어떻게 만들 수 있습니까?

답변

0

UI는 STA 스레드이므로 생성 한 스레드와 다른 스레드에서 액세스 할 수 없습니다. 또는 "Control.Invoke"을 사용하여 할 수 있지만이 경우 메시지 루프에서 실행되므로 일부 지연이 발생할 수 있습니다.

4

스레드 캐논을 가져 오기 전에 perf 문제를 해결하는 것이 좋습니다. 50 밀리 초는 시간입니다. 이 샘플 코드는 최적화되지 않은 경우에도, 상호 작용에 영향을 미치지 아니하거나 CPU 부하에 글을 만든 :

Random rand = new Random(); 

    private void timer1_Tick(object sender, EventArgs e) { 
     using (var bmp = new Bitmap(1, 1)) { 
      using (var gr = Graphics.FromImage(bmp)) { 
       gr.CopyFromScreen(rand.Next(800), rand.Next(600), 0, 0, new Size(1, 1)); 
       Console.WriteLine(bmp.GetPixel(0, 0).ToString()); 
      } 
     } 
    }