2010-11-19 4 views
0

캔버스에 1 초마다 무언가를 그려 봅니다. 그런 다음 스레드를 생성하여 1 초 후에 수면을 그리는 메서드를 호출합니다. 문제는 Canvas 객체를 호출하여 호출하는 것입니다. 프로그램이 오류 메시지를 표시합니다.WPF : 스레드를 사용하여 캔버스에 무언가를 그리는 데 문제가 있습니다.

다른 스레드가이 스레드를 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다.

코드

private void drawTimeTick() { 
     ... 
     Thread iThread = new Thread(new ThreadStart(tickThread)); 
     iThread.Start(); 
    } 
    private void tickThread(){ 
     try 
     { 
      Thread.Sleep(1000); 
      ... 
      Canvas.SetLeft(tick, 700); 
      Canvas.SetTop(tick, 30); 
     }catch(Exception ex){ 
      MessageBox.Show("Exception tickThread : "+ex.Message); 
     } 
    } 

어떻게 그릴 스레드에서 캔버스에 액세스하려면?

+0

threading보다 WPF를 사용하여 wayyyyy 더 좋은 방법이 있습니다. 그래야만 캔버스에있는 Dispatcher를 사용할 수 있습니다. – Pierreten

+0

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke.aspx – Pierreten

+0

@Pierreten : 대답은 받아 들일 수 있고 투표 할 수 있습니다. – Jens

답변

3

DispatcherTimer 클래스를 살펴보십시오. 이 시나리오는 MSDN 예제에서 볼 수 있듯이 정확하게 설계되었습니다.

0

그래픽 객체를 만든 스레드와 다른 스레드에서 그래픽 객체에 액세스 할 수 없습니다.

2

당신은

this.Dispatcher.Invoke((Action)(() => 
            { 
             Canvas.SetLeft(tick, 700); 
             Canvas.SetTop(tick, 30); 
            })); 

(나는 this 일부 UI 컨트롤입니다 있으리라 믿고있어.없는 대신 Application.Current.Dispatcher를 사용할 수있는 경우)을 호출 할 수 있습니다. UI 스레드에서 캔버스 작업을 실행합니다.

+0

솔루션을 제공해 주셔서 감사합니다. –

1

DispatcherTimer를 사용해 보았습니다.

DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Tick += tickThread; 
     timer.Start(); 
    } 
    private void tickThread(object sender, EventArgs e) 
    { 
     try 
     { 
      tick.thisTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second); 
      double TickPixel = GetPixel(ClassTimeline.Width, startTime, endTime, tick.thisTime); 
      Canvas.SetLeft(tick, TickPixel); 
      Canvas.SetTop(tick, 30); 
     }catch(Exception ex){ 
      MessageBox.Show("Exception tickThread : "+ex.Message); 
     } 
    } 
관련 문제