powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поток и ProgressBar
17 сообщений из 17, страница 1 из 1
Поток и ProgressBar
    #39729301
kat3181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Имеется класс, в котором функцией getCases делается выборка из базы, в цикле создаются какие-то объекты, и возвращает она список с этими объектами. Далее эта функция вызывается в форме.
Как правильно выполнять эту функцию в потоке? Чтобы во время ее выполнения на форме двигался ProgressBar?

До недавнего времени цикл находился в форме, там вроде понятно, как это сделать, а если цикл в другом классе...?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class SomeClass
{
    public static List< > getCases()  
    {
        List< > casesList = new List< >();

        // тут выполняется запрос к базе

         for (int i = 0; i < N; i++)  // большущщий и тяжелый цикл
         {
               Case case = new Case();
                . . .
                casesList.Add(case);
          }            
            return casesList;
        }




Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public partial class Form1 : Form
{
    List< > data = new List< >();

     private void button1_Click(object sender, EventArgs e) 
     {
         data = SomeClass.getCases();
      }
       
}
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729304
kat3181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kat3181,

к слову, getCases() принимает кучу аргументов
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729319
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kat3181,
Прогрессбар внутри формы и async.
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729363
kat3181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123kat3181,
Прогрессбар внутри формы и async.

Только начинаю с потоками работать, не совсем понятно...
То есть цикл нужно вынести в отдельную функцию, которую потом вызвать через await?
А с прогресс бар как? Что-то типа такого?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class SomeClass
{
    public static List< > getCases( ...параметры ...)  
    {
        List< > casesList = new List< >();

        // тут выполняется запрос к базе

        await Task.Run( delegate () { createCases(casesList); });
         return casesList;
    }


    private static void createCases ( List < > casesList)
    {
         for (int i = 0; i < N; i++)  // большущщий и тяжелый цикл
         {
               Case case = new Case();
                . . .
                casesList.Add(case);
          }  
    }   
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public partial class Form1 : Form
{
    List< > data = new List< >();

     private void button1_Click(object sender, EventArgs e) 
     {
           data = SomeClass.getCases(...параметры...);

           progressBar1.Maximum = k;
           progressBar1.Value = 0;
           progressBar1.Step = 1;
           progressBar1.PerformStep();
      }
}
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729379
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kat3181То есть цикл нужно вынести в отдельную функцию, которую потом вызвать через await?да.
Делай.
Прогресс потом. Слона надо есть по частям.
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729385
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BackgroudWorker посмотрите, он поможет
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729390
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
47.
48.
  worker_src = new BackgroundWorker();
                worker_src.WorkerReportsProgress = true;
                worker_src.DoWork += Worker_src_DoWork;
                worker_src.ProgressChanged += Worker_src_ProgressChanged;
                worker_src.RunWorkerCompleted += Worker_src_RunWorkerCompleted;
                worker_src.RunWorkerAsync();



    private void Worker_src_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.CurrentProgress_src = e.ProgressPercentage;
        }

///Твой метод, по которому ты хочешь смотреть прогресс
    private void DoWork(object sender, DoWorkEventArgs e)
        {
//наращиваешь значение прогресса
           curworkedspravrowindex++;
        }

  }
        private int currentProgress_src = 0;
        public int CurrentProgress_src
        {
            get { return this.currentProgress_src; }
            private set
            {
                if (this.currentProgress_src != value)
                {
                    this.currentProgress_src = value;
                    OnPropertyChanged();
                }
            }
        }
        public int rowcount_src { get; set; } = 0;
        private int _curworkedspravrowindex_src = 0;
        public int curworkedspravrowindex_src
        {
            get
            { return _curworkedspravrowindex_src; }
            set
            {
                _curworkedspravrowindex_src = value;
                worker_src.ReportProgress(_curworkedspravrowindex_src * 100 / rowcount_src);
                progressText_src = _curworkedspravrowindex_src.ToString() + " из " + rowcount_src.ToString();
            }
        }



Код не рабочий- накидал по быстрому основные моменты, чтобы на мысль натолкнуть.
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729412
kat3181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123kat3181То есть цикл нужно вынести в отдельную функцию, которую потом вызвать через await?да.
Делай.
Прогресс потом. Слона надо есть по частям.

Вроде работает, но без прогресса...

Только для прогресса надо бы знать, сколько итераций будет в цикле, наверно? Выполнить запрос, посчитать, сколько будет объектов, и передать в форму? А потом уже создавать объекты...?
Не понятно, как заставить прогресс двигаться
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729414
kat3181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub, Супер_Пав,

спасибо, буду разбираться
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729418
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая разница в каком классе цикл?

используйте
Progress<T> : IProgress<T>
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39729439
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kat3181сколько итерацийдо этого как решал?
Либо узнать либо бесконечный прогрессбар и работай его не дожидаясь.
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39735012
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public void getCases(ProgressBar progbar)
{
        progbar.Maximum = 10000;
        for (int i = 0; i < 10000; i++)
        {
                this.Invoke(
                (MethodInvoker)delegate
                {
                    progbar.Value = i;
                });
        }
}
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39735056
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7а если так?а где тут поток и входные выходные в него?
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39735062
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123jenya7а если так?а где тут поток и входные выходные в него?
Инвокер обеспечит изменение контрола в другом потоке. У меня работает.
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39735087
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать Invoke нужно вот так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
if (this.InvokeRequired)
{
	this.Invoke((MethodInvoker)MyMethod);
}
else
{
	MyMethod();
}


Но это актуально только тогда, когда у вас есть указатель на объект элемента управления.
IProgress<T> более универсальный подход, но у него тоже есть свои подводные камни, если вы создаете объект Progress<T> не в STA потоке, то выполняться он будет в том потоке, в котором вы его создали или произвольном, точно уже не помню.
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39735112
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Инвокер обеспечит изменение контрола в другом потоке. У меня работает.устарело.
Сейчас надо не контрол менять, а класс подписать на событие. А контролы ГУИ еще дальше от этого дела и потоков.
Типо биндинг, MV***, Action и т.д.
...
Рейтинг: 0 / 0
Поток и ProgressBar
    #39735113
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7У меня работает.не удивляюсь. Работает все, что программист не напишет)).
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поток и ProgressBar
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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