powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поток и ProgressBar
6 сообщений из 6, страница 1 из 1
Поток и ProgressBar
    #38397197
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На форме есть прогресс-бар и надпись. При появлении формы я запускаю отдельный поток, в котором идет копирование файлов. Из этого потока через делегата я меняю значения прогресс-бара и надписи. По окончании копирования форму надо закрыть (в примере я меняю цвет формы). Почему так получается, что прогресс-бар до конца не заполнился, а цвет формы уже сменился (то есть основной поток был проинформирован об окончании вспомогательного потока, хотя визуально это не так)?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
namespace PBarAndProc
{
    public partial class Form1 : Form
    {
        delegate void Copy();
        delegate void ToBrogressBar(string s1, string s2);
        ToBrogressBar ToBarFunc;

        public Form1()
        {
            InitializeComponent();
            ToBarFunc = new ToBrogressBar(ToPBar);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Copy cpy = new Copy(CopyMy);
            IAsyncResult res = cpy.BeginInvoke(new AsyncCallback(CallBack), null);
        }

        void CallBack(IAsyncResult r)
        {
            label1.Text = "Готово!";
            this.BackColor = Color.Red;
            //this.Close();
        }

        void ToPBar(string s1, string s2)
        {
            progressBar1.Value++;
            label1.Text = s1 + " -> " + s2;
        }

        void CopyMy()
        {            
            int n = 100;
            for (int i = 0; i < n; i++)
            {                
                Thread.Sleep(5);    // Copy...
                progressBar1.Invoke(ToBarFunc, new object[] { (i + 1).ToString(), (n).ToString() });
            }
        }
    }
}
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #38397254
cynep kopoBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,
Как вы вычисляете новое значение? Вообще, какая-то каша-малаша. Если у Вас цикл до 100, то и совпадение будет только при копировании 100 файлов. Значит Вам нужно изменять ProgressBar1.Maximum и делать его равным числу файлов, Либо после копирования файла вычислять новое значение Бара вручную по формуле: (файлов_скопировано / всего_файлов * 100)
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #38397294
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, максимум для бара = кол-во файлов, здесь код приведен без этого для простоты. По умолчанию максимум у бара = 100, вот и цикл с якобы копированием до 100. В реальном приложении у меня определяется кол-во файлов, но эффект то же: например файлов 250, на 245 идет оповещение, что мол все скопировано, форму можно закрывать, хотя прогресс-бар до 100% не дошел...
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #38397373
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вернее все файлы будут скопированы физически, а вот визуально кажется, что прогресс-бар до 100% не дошел, а уже надо закрывать форму (в примере - менять фон)...
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #38397403
cynep kopoBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, а "вылетов" при ошибке копирования в CopyMy у Вас не приключается? это могло бы объяснить отставание счетчика
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #38397417
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня же копирование условное - Thread.Sleep(5);
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поток и ProgressBar
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]