2013-12-09 6 views
0

음악 메모 배열을 반복하고 연속적으로 재생하는 메서드가 있습니다. foreach 루프의 상태를 보여주는 진행률 표시 줄을 만들었습니다. 문제는 진행률 막대가 100 %까지 채우지 않고 85 %까지 채우는 것입니다. 나는 또한 진도 표시 줄이 대략 진행되고 있다고 지적했다. 나는 계단이 크기 때문에 이것이 가능할 것이라고 생각한다. 나는이 진행 표시 줄을 최적화 할 수있는 방법에 대한 아이디어, PB는foreach 루프가있는 진행 표시 줄

public void PlayAll() 
    { 
     pb.Maximum = Convert.ToInt32(CountTotalDuration()); //Total lenght of the full song. 
     pb.Step = Convert.ToInt32(CountTotalDuration())/Convert.ToInt32(ListSize()); //Total lenght of each note making up the song. 
     foreach (MusicNote m in list) 
     { 
      m.sp.Stop(); 
      m.sp.Play(); 
      Thread.Sleep(m.NoteDuration*100); 
      pb.PerformStep(); 
     } 
    } 

답변

1

이상한 소리가 나는 문제를 발견하지 못했지만, 나는 당신이이 같은 시도 할 수 있습니다 제안 :

더욱 더
public void PlayAll() 
    { 
     pb.Maximum = Convert.ToInt32(ListSize()); //Total lenght of the full song. 
     pb.Step = 1; 
     int i = 1; 
     foreach (MusicNote m in list) 
     { 
      m.sp.Stop(); 
      m.sp.Play(); 
      Thread.Sleep(m.NoteDuration * 100); 
      pb.Value = i++; 
     } 
    } 

, 어쩌면 당신은, 사용자 경험을 향상시키기 위해 멀티 스레딩을 사용한다 Thread.sleep를하기 때문에 그 모양을 죽은 것처럼 만든다.

3

문제가 단계의 오류를 반올림입니다 진행률 표시 줄의 내 예, 감사합니다. 간단한 예를 살펴하자, 두 개의 정수 번호를 가지고 있기 때문에 당신이 100CountTotalDuration()7

ListSize()이 있다고 /는 정수 나눗셈을 수행하고 (285714가 반복으로 대신 14.285714) 어떤 나머지 그렇게 100/714 동일 버린다 . 그러면 단계 크기가 14로되어 7 단계를 거친 후에 도달 한 총 값은 98이고 도구 모음에서 98 %가 표시됩니다.

CountTotalDuration()NoteDuration의 합계로 표시되므로이 문제를 해결하는 방법은 각 단계마다 동일한 단계 크기를 사용하지 않는 것입니다. 대신, 최대 지속 시간을 설정하고 토트 지속 시간만큼 막대를 증가 시키십시오. 이렇게하면 음 길이에 따라 노래의 위치에 비례하여 막대가 점프됩니다.

public void PlayAll() 
{ 
    pb.Maximum = Convert.ToInt32(CountTotalDuration()); //Total lenght of the full song. 
    int currentCount = 0; //Initialize our counter to 0. 

    foreach (MusicNote m in list) 
    { 
     m.sp.Stop(); 
     m.sp.Play(); 
     Thread.Sleep(m.NoteDuration*100); 

     //Increment the counter proportional to the length of the note. 
     currentCount += m.NoteDuration; 

     //Set the progress bar using our calculated position. 
     pb.Value = currentCount; 
    } 
} 

당신은 여전히 ​​긴 메모를 재생할 때, Thread.Sleep(m.NoteDuration*100);를 사용하는 대신 여러 개의 짧은 일시 중지를 사용하고 그 일시 중지 사이에 줄을 업데이트되지 않도록를 해결하는 유일한 방법은 큰 점프를 할 것입니다. 또한 Thread.Sleep은 루프를 일시 중지하는 가장 좋은 방법은 아니지만 대신 가장 좋은 대안이 무엇인지 모릅니다. 우리와 공유하지 않은 많은 세부 사항에 달려 있습니다.


는 또한 기존의 방법과 유사한 동작을 각각 주 1 씩 노트 점프 재생하고 당신이 재생됩니다 노트의 수에 바의 최대 동등하게 가질 수있다.

이렇게하면 메모 당 점프 수가 늘어나지 만 노래가 몇 음표이면 점프해도 여전히 매우 커질 수 있습니다.