2009-03-30 3 views
2

이클립스에서 IProgressMonitor 구현을 보았습니다.이 역시 이후 SharpDevelop에서도 구현되었지만 어떻게 작동하는지 잘 모르겠습니다. 조금 더 이해하기 쉬운 다른 예가 있습니까?C#에서 진행 모니터 구현

내가 달성하고자하는 것은 하나의 진행률 표시 줄 (작업이 임의의 시점에 추가 될 수 있음)에 의해 많은 작업 (20 분에서 5 초까지 크게 달라짐)의 진행 상황을 추적하는 방법입니다.

이와 비슷한 것이 좋은 대안/아이디어일까요?

interface ITask 
{ 
    int TotalWork; // ProgressMax 
    event Progresschanged; // Notifies of the current progress 
    event ProgressComplete; 
} 

"모니터"는 Observer 패턴을 사용하여 두 이벤트를 모니터링하기 만합니다. 모든 진행 표시 줄이 완료되면 진행 표시 줄이 숨겨집니다. 다른 문제는 이들이 생성되는 별도의 스레드라는 것입니다.

누구나 내게 조언하거나 올바른 길로 나를 인도 할 수 있습니까?

+0

IProgressMonitor는 .net 프레임 워크의 일부가 아닙니다. 구글을 통해 보면, 그것은 일식 api의 일부로 보인다 .../어깨를 으.. – Tony

+0

(작업은 언제든지 추가 할 수 있습니다) - 진행률 표시 줄이 축소되면 괜찮습니까? – dss539

+0

내가 제공 한 예를 업데이트했습니다. 죄송합니다. 지금까지 게시하지 않으 셨습니다. http://stackoverflow.com/questions/596991/c-multi-thread-pattern/956297#956297 SwDevMan81

답변

1

System.Component.BackgroundWorker는 진행률 알림을 처리합니다. 여러 명의 BG 직원을 생성하고 UI 스레드의 단일 메서드로 다시보고하도록합니다. 그런 다음 진행률 막대를 업데이트 할 수 있습니다.

2

작업 목록을 유지 관리하고 전체 기여도에 따라 가중치를 부여하십시오. 이 구현은 에 의미

struct Task { int work, progress } 
class OverallProgress 
{ 
    List<Task> tasks; 
    int Work { get { return tasks.Sum(t=>t.work; } } 
    int Progress { get { return tasks.Sum(t=>t.progress/t.work); } } 
    void AddTask(Task t) { tasks.Add(t); } 
} 

는 개념을 보여줍니다.

예이 구현은 효율적이지 않습니다. Work 계산을 저장하여 새 작업이 추가 될 때만 다시 계산할 수 있습니다.

예 정수 나누기를 수행하면 정밀도가 떨어질 수 있습니다. 자신 만의 이벤트도 연결해야합니다.

이러한 작업에 문제가있는 경우이를 언급하고 나 또는 다른 누군가가 그러한 클래스의 전체 구현을 제공 할 수 있습니다.