2012-06-15 3 views
2

좋아, C#/.NET을 배웠고 지금까지 winforms를 고수했지만 WPF는이 프로젝트에 적합하다고 보였다.System.Timers.Timer가 반복 될 때마다 썩음

나는 이미지 배열을 표시하는 WrapPanel이 있습니다. 때로는이 배열이 창 경계를 초과하게 만듭니다. 모든 이미지가 타이머를 사용하여 표시 될 때까지 "페이지"를 순환하려고합니다.

public void t2_Elapsed(object source, ElapsedEventArgs e) 
    { 

     wrapPanel1.Dispatcher.BeginInvoke((ThreadStart)delegate 
     { 
      remaining = Convert.ToInt32(imgCount) - (iteration*xDensity); 

      label1.Content = iteration; 
      label2.Content = remaining; 
      label3.Content = imgCount; 

      if (remaining <= 1) 
      { 
       Thickness marginTop = wrapPanel1.Margin; 
       marginTop.Top = 0; 
       wrapPanel1.Margin = marginTop; 
       wrapPanel1.Children.Clear(); 
       t2.Stop(); 
       imgLayout(); 
      } 

      else 
      { 
       Thickness marginTop = wrapPanel1.Margin; 
       marginTop.Top = -((prevResY+10) * iteration); 
       wrapPanel1.Margin = marginTop; 
       iteration++; 
      } 
     }); 
    } 

imgCount가 나타내는 더블 : 오버 플로우가있는 경우

내 WrapPanel (wrapPanel1)가 이미 채워 된이 시점에서 타이머 경과 이벤트에서 내 코드 샘플을 시작하고 확인합니다 WrapPanel의 총 이미지 수 (코드 내의 다른 위치와의 상호 작용으로 인해 두 배가되어야 함)

xDensity는 가로로 표시되는 이미지의 수를 설정하는 사용자 정의 정수입니다.

prevResY는 각 사진의 높이 (모두 같은 해상도)입니다. WrapPanel이 채워질 때마다 설정되는 5 픽셀 여백을 고려하여 10을 추가합니다. 반복을 곱함으로써 wrapPanel1을 항상 1 행 위로 이동시킵니다.

imgLayout(); 모든 페이지를 실행할 때마다 새 이미지가 있는지 확인하고 끝에서 오래된 이미지를 노크 할 때마다 프로세스가 다시 시작됩니다. 이것은 imgLayout()에서 모두 처리됩니다.

디버깅 중에 레이블을 업데이트하여 예상 한 값을 정확하게 반환합니다.

질문 제목에서 수집 한 것처럼 내 문제는 내 t2_elapsed를 반복 할 때마다 간격이 늘어나는 것입니다. 동작을 관찰하기 위해 간격을 10ms로 설정하면 지연이 기하 급수적으로 증가하는 것처럼 보입니다. 30 초 후 지연은 약 25 초이며, 처음에는 0.1에서 증가했다. RAM 사용량이 천천히 올라가서 루프가 다시 시작될 때 일부 리소스가 삭제되지 않고 그 원인인지 또는 별도의 문제인지 확실하지 않습니다.

누군가 도움을 줄 수 있기를 바랍니다. 내가 바보 같은 짓을했다면, 나에게 아직도 말해, 나 아직도 배우고있어!

확인

많은 감사

---- 업데이트 ---- 나는 그것이

wrapPanel1.Children.Clear(); 

라인을 함께 할 수있는 뭔가 생각 때문에. 나는 그것을 제거하고 그것을 채우도록하고 지연시키지 않는다. 그러나 이것은 분명히 최종 해결책이 아니다. 그 줄을 어디에두면 문제가 재현됩니다. 2 ----

---- UPDATE 그럼 지금은 오히려 바보 같은 느낌. 이전 타이머가 내가 사용하던 시작되는 imgLayout() 방법 :

t2.Interval = new TimeSpan(0, 0, 0, 0, 5000); 
t2.Tick += new EventHandler(t2_Tick); 
t2.Start(); 

내가 바보 이벤트 핸들러에게 루프를 다시 시작할 때마다 선언했다. 대신 Window_Loaded 메서드에서 설정하고 현재 예상대로 정확하게 작동하고 그냥 약간 정돈하고 한 번에 하나의 전체 페이지를 한 번에 한 페이지 씩 스크롤하는 방법을 구현했습니다.

+0

얼마나 많은 이미지를 표시합니까? 합리적인 시간 내에 그들을 정리/처분 할 수없는 것 같습니다. – Tudor

+0

테스트 목적으로 분당 9 개의 이미지 폴더가 있으며 한 번에 4 개씩 표시하도록 설정되어 있습니다. 현실 세계 시나리오에서는 주어진 시간에 약 60 개까지 처리해야 할 수 있습니다. – Rich

답변

4

WPF에서 반복되는 작업을 처리 할 때는 System.Windows.Threading.DispatcherTimer을 사용하는 것이 좋습니다. BeginInvoke을 필요로하지 않고 디스패처 스레드에서 코드를 자동으로 실행합니다.

+0

감사합니다. 타이머를 Dispatcher.Timer로 변경했는데, 그 타이머를 인식하지 못했습니다! 메모리 사용량이 감소했지만 전반적인 문제가 계속 발생합니다. – Rich

+0

@RMilne : 어쨌든 문제가 발견되어 기쁩니다. 나는 무엇이 잘못되었는지에 대한 아이디어가 부족했습니다. 어쩌면 해결책으로 직접 답변을 게시하고 승인 된 것으로 표시해야합니다. :) – Tudor

관련 문제