2011-11-09 2 views
1

나는 시뮬레이터가 일부 데이터를 계산하고 각 반복으로 이산 시간을 통해 이동하는 반복으로 구성된 시뮬레이션 프로세스를 사용합니다. 시뮬레이터를 지나면 일부 주기적 간격으로 구성 요소 매개 변수를 새 데이터로 업데이트해야합니다. 시뮬레이터의 구성 요소는 반복 계산에 사용됩니다.WPF C# .NET에서 실시간 시뮬레이션 프로세스의 시각화

현재 모델은 20 초 간격의 타이머를 기반으로합니다. 각 타이머 틱에 대해 시뮬레이터는 가능한 한 빨리 20 반복을 계산하고 나머지 시간 (20 초를 시뮬레이션하는 데 20 초 - 시간) 동안 새 데이터를 사용할 수있는 경우 구성 요소 매개 변수를 새 데이터로 업데이트합니다. 그것은 아주 좋은 작품이지만 ...

... 나는 MVVM 패턴을 사용하여 WPF에서 시각화 프로그램을 구현했고, 시뮬레이션이 시작되면 한 번 적절한 시간 간격으로 각 반복의 상태를 표시합니다. 따라서 각 반복이 1 초의 시간 간격을 나타내는 경우 해당 시각화 프로그램이 시각화 상태를 1 초마다 변경하기를 원합니다. 나는 시뮬레이터에서 상태를 위해 비주얼 라이저와 버퍼에서 타이머를 사용하여 작업을 수행했습니다. 기본적으로 시뮬레이터는 계산 된 상태를 대기열에 넣고 시각화 도우미는 각 타이머 틱을 대기열에서 빼낸다. 그것은 몇 가지 예외와 잘 작동합니다.

  1. 그것은 일정한 눈금 간격이 어렵습니다 그래서 vizualizer 빠른 때 비주얼 타이머 시뮬레이터 타이머 또는 주변에 다른 방법으로 다음 느린 경우 큐가 무한대로가는 (IT 프로세스, 쓰레드 우선 순위 등을에 따라 다름).
  2. 시각화하려는 모든 데이터에 대해 adn 구현 코드를 사용하면 구현 시간 오버 헤드 및 메모리 오버 헤드로 보입니다.

그래서 대체 솔루션을 생각하고있었습니다. 비주얼 라이저에 하나의 타이머가 있고 타이머의 각 틱에 대해 시뮬레이터에서 새 반복 계산을위한 비동기식 메서드를 백그라운드 스레드라고합니다. 비주얼 라이저의 비동기 콜백에서, visualizer는 시뮬레이터에서 새로운 계산 된 상태를 기반으로 시각화를 새로 고칩니다. 이 방법을 사용하면 시뮬레이터의 구성 요소를 새로 고치는 데 문제가 있습니다. 타이머 간격을 한 번 새로 고치려면 시간이 더 필요하기 때문입니다. 어쩌면 새로운 백그라운드 스레드에 구성 요소를 새로 고칠 수 있고 일단 업데이트가 완료되면 새로운 값을 구성 요소의 매개 변수 값에 복사하는 구성 요소에서 메서드를 호출하면됩니다.

또한 시뮬레이터는 실시간이기 때문에 실시간과 보조를 맞춰야합니다. 당신이 더 무슨 방법 말해 줄 수와 어떻게 접근을 향상시킬 수 있지만, 누군가 더 좋은 방법이 또한 만약 내가 그것을 읽고 그것을 사용 :

감사 기쁠 경우

도움이 될 것입니다.

답변

1

databinding을 사용하면 데이터가 업데이트 될 때 UI가 자동으로 업데이트됩니다. 예외적 인 경우는 주로 ObservableCollections입니다. ObservableCollections을 사용하는 경우 컬렉션의 개별 항목에 바인딩해야합니다. 당신이 수동으로 할 수있는 항목을 추가 할 때 항목을 추가 할 때 항목을 제거 할 때 (메모리 누수를 피하기 위해 중요합니다) OC에서 파생 된 클래스를 작성하십시오.

+0

MVVM 패턴을 사용 중이지만 한 가지 예외가 있습니다. 내 모델에 "inotify 속성이 변경되었습니다."일반적인 방법으로 구현되지 않았습니다. 나는 시뮬레이터의 상태를 읽은 뷰 모델의 업데이트 메소드를 호출하는 비주얼 라이저의 타이머를 가지고 있으며 뷰 모델 속성의 변경시 inotifypropertychanged가 발생합니다. – Vedran

+0

수동 대신 자동 ("보통"방식) 업데이트를 사용해 보셨습니까? –

+0

WPF 기반 응용 프로그램뿐만 아니라 콘솔 응용 프로그램에서도 모델을 사용할 수 있으므로보기 모델에 대한 모델을 알고 싶지 않기 때문에 그다지 좋아하지 않았습니다. 그러나 모델이 inotifyproperty 변경을 발생시키는 것을 고려하고있었습니다.또한 초를 고려할 것이라고 생각합니다. – Vedran

관련 문제