2013-04-20 5 views
1

мое приложение запускает файлы, и каждый файл имеет собственное время работы. эта функция получить в миллисекундах времени, что время прогресса должно работать:ProgressBar работает слишком быстро, чем определено

timerProgress = my timer 
pbStatus = my progress bar 

public void AnimateProgBar(int milliSeconds) 
{ 
    if (!timerProgress.Enabled && milliSeconds != 0) 
    { 
     pbStatus.Value = 0;; 
     timerProgress.Interval = milliSeconds/100; 
     timerProgress.Enabled = true; 
    } 
} 

и это мой таймер заполнить индикатор:

private void timerProgress_Tick(object sender, EventArgs e) 
    { 
     if (pbStatus.Value < 100) 
     { 
      pbStatus.Value += 1; 
      pbStatus.Refresh(); 
     } 
     else 
     { 
      timerProgress.Enabled = false; 
     } 
    } 

моя проблема заключается в том, что прогресс бар работает слишком быстро Например, если AnimateProgBar получает значение 12000 (12 секунд), индикатор выполнения работает только в течение 6-7 секунд.

+1

Вы делите ('миллисекунды/100') полные милисекунды. Вот почему он работает быстрее, чем вы хотите. –

+0

Я предполагаю, что значения Min и Max вашего индикатора выполнения равны 0 и 100, а шаг = 1? – Yeronimo

+0

Да, min = 0, max = 100 и step = 1, как его исправить? – user2214609

ответ

3

Это тусклый, что ваш код не работает. Я пробовал его несколько раз, и он пропустил около 0,6 секунды каждый раз; кажется таймер просто неточный.

Что вы могли бы сделать, это позаботиться о времени самостоятельно, вместо того, чтобы доверять таймер:

WithEvents Tmr As New Timer With {.Interval = 100} 
Dim startTime As Date, AnimationTime% 

Sub AnimateProgress(ms%) 
    If ms <= 0 Then Exit Sub 

    ProgressBar1.Value = 0 
    AnimationTime = ms 
    startTime = Now 

    Tmr.Start() 
End Sub 

Private Sub Tmr_Tick() Handles Tmr.Tick 
    ProgressBar1.Value = Math.Min((Now - startTime).TotalMilliseconds/AnimationTime, 1) * 100 
    If ProgressBar1.Value = 100 Then Tmr.Stop() 
End Sub 

EDIT - Ответ на ответ ниже:

Ой извините, нет это vb.net. Я знаю оба языка так же хорошо, но я предпочитаю vb и, как правило, думаю, что все остальные делают это тоже.

Вот C# версия:

DateTime startTime; int animationTime; 

void AnimateProgress(int ms) { 
    if (ms <= 0) return; 

    progressBar1.Value = 0; 
    animationTime = ms; 
    startTime = DateTime.Now; 

    Tmr.Start(); 
} 

private void Tmr_Tick(object sender, EventArgs e) { 
    progressBar1.Value = (int)(Math.Min((DateTime.Now - startTime).TotalMilliseconds/animationTime, 1) * 100); 
    if (progressBar1.Value == 100) Tmr.Stop(); 
} 
+1

это C# ....? – user2214609

+2

@ user2214609 Он обновил нить. Не будьте грубыми ... Он приложил все усилия, чтобы помочь вам. –

+0

большое спасибо за вашу помощь! – user2214609

0

Вы можете попробовать с этим образцом, на основе PerformStep method

var progressBar = new System.Windows.Forms.ProgressBar(); 
progressBar.Maximum = 100; 
progressBar.Minimum = 0; 
progressBar.Step = 10; 

//begin loop 

//Your treatment of step 
progressBar.PerformStep(); 

//end loop 

MSDN ссылка: http://msdn.microsoft.com/fr-fr/library/system.windows.forms.progressbar.performstep(v=vs.80).aspx

Вы образец здесь

private void CopyWithProgress(string[] filenames) 
{ 
    // Display the ProgressBar control. 
    pBar1.Visible = true; 
    // Set Minimum to 1 to represent the first file being copied. 
    pBar1.Minimum = 1; 
    // Set Maximum to the total number of files to copy. 
    pBar1.Maximum = filenames.Length; 
    // Set the initial value of the ProgressBar. 
    pBar1.Value = 1; 
    // Set the Step property to a value of 1 to represent each file being copied. 
    pBar1.Step = 1; 

    // Loop through all files to copy. 
    for (int x = 1; x <= filenames.Length; x++) 
    { 
     // Copy the file and increment the ProgressBar if successful. 
     if(CopyFile(filenames[x-1]) == true) 
     { 
      // Perform the increment on the ProgressBar. 
      pBar1.PerformStep(); 
     } 
    } 
} 

ссылка: http://msdn.microsoft.com/fr-fr/library/system.windows.forms.progressbar.performstep(v=vs.80).aspx

+0

как я могу использовать его в своем коде? – user2214609

+0

foreach terminated step add rogressBar.PerformStep(); , первые четыре строки, вы установили в верхней части своего метода для инициализации своего поведения –

+0

весь этот код внутри моего метода AnimateProgBar? как насчет моего таймера? и о какой петле вы говорите? – user2214609

0

Я не мог воспроизвести проблему. Я просто протестировали новую форму с ProgressBar и Таймер, как вы подробным в вашем вопросе, а лишь добавил одну кнопку, чтобы запустить тест, и один ярлык, чтобы показать истекшее время:

DateTime start; 
    private void button1_Click(object sender, EventArgs e) 
    { 
     start = DateTime.Now; 
     AnimateProgBar(12000); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     label1.Text = DateTime.Now.Subtract(start).TotalSeconds.ToString(); 
     //the rest of your code, starting with "if (pbStatus.Value < 100)" 

Я последовательно получил 12,6 секунд до тех пор, пока не достигнет уровня progressBar (и таймер остановился, замораживая текст метки). Может быть, часть вашего progressBar скрыта?

[Редактировать] Если вам интересно узнать о дополнительных секундах, которые BlackCap также отметил, это потому, что вы устанавливаете интервал таймера на 120 миллисекунд, но события таймера имеют разрешение около 18 миллисекунд, поэтому оно будет на самом деле огонь на 126 вместо 120.

Смежные вопросы