Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
12 / 12 / 3
Регистрация: 22.10.2010
Сообщений: 137

BackgroundWorker и индикация процесса

28.03.2017, 09:23. Показов 819. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
События и возвращаемые методы
я тут уже задавал вопрос про возвращение значения, но появилась новая задача:
запускаю процесс преобразования файлов таблиц. Это преобразование происходит в отдельном классе.
Как можно из этого класса получать значения выполнения процесса для progressBar?

Кликните здесь для просмотра всего текста

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public delegate void ChangePercentComplite(object sender);
public partial class Form1 : Form
    {
    public Form1()
        {            
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }  
            ConvertSelectetdFile csf = new ConvertSelectetdFile();
        List<DataArray> workList_2 = new List<DataArray>();
 
 
    private void button1_Click(object sender, EventArgs e)
               {
                    workList_2.Clear();
                    if (backgroundWorker1.IsBusy != true)
            {
                label2.Text = "start!!!!";
                // start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync(file);
            }           
           }
    }
 
 
 private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            progressBar1.Value = 0;
            System.ComponentModel.BackgroundWorker worker = sender as System.ComponentModel.BackgroundWorker;
            workList_2.AddRange(csf.convertSelectetdFile(e.Argument.ToString()));
        }
private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            label2.Text = "Done!";
            label4.Text = workList_2.Count.ToString();
        }
 
 
 
 
 
class ConvertSelectetdFile
    {
 
        private delegate List<DataArray> ConvertFile(string path);
                public event ChangePercentComplite onChange;
 
        public ConvertSelectetdFile()
                {
                    _dictionary = new Dictionary<string, ConvertFile>
                    {
                        {".xls", pars_xls },
                        {".xlsx",  pars_xlsx },
                        {".xml", pars_xml },
                    };
                }
 
        public List<DataArray> convertSelectetdFile(string file)
                {
                    return _dictionary[Path.GetExtension(file)] (file);
                }
 
/// <summary>
        /// метод обрабатывающий файлы формата "*.XLSX"
        /// </summary>
        /// <param name="file">путь к файлу</param>
        /// <returns>преобразованный файл для дальнейшего анализа</returns>
        private  List<DataArray> pars_xlsx(string file)
        {
        ...............................................
        некий код
        ...........................................
           if (onChange != null)// событие
            {
              onChange(i);
            } 
            return workList;
        }
 
}


private List<DataArray> pars_xlsx(string file) вот здесь происходит обработка файла таблицы и как можно из этого метода передавать значение прогресса выполнения в главную форму?
Пытал через событие возвращать значение, но получается через раз и иногда просто Студия выдаёт ошибку.
Спасибо!

Добавлено через 15 часов 46 минут
может быть кто-то подскажет если в Do_Work не выполнять действие, а запускать некий метод другого класса, который и будет долго выполняться.
и как из этого процесса возвращать максимальное значение допустим строк, чтобы это передать в ProgreeBar и потом после обработки каждой строки делать инкремент готовности в ProgressBar

Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.03.2017, 09:23
Ответы с готовыми решениями:

Индикация процесса сохранения данных в ProgressBar
Как можно привязать ProgressBar к процессу сохранения(5сек) , чтоб он показывал ход сохранения и в завершении процесса обнулялся?

Запуск нового процесса в контейнере существующего процесса
Здравствуйте. Недавно задался целью запустить игру(minecraft), которая уже имеется на компьютере, с помощью кода на C#. Реализовал это с...

Завершение процесса при обнаружении другого процесса
Здравствуйте. Люди добрые подскажите пожалуйста как мне быть. Есть приложение которое следит за процессами в диспетчере, запущены 2...

2
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
28.03.2017, 11:14
Цитата Сообщение от Speedy Gonzales Посмотреть сообщение
может быть кто-то подскажет если в Do_Work не выполнять действие, а запускать некий метод другого класса, который и будет долго выполняться.
и как из этого процесса возвращать максимальное значение допустим строк, чтобы это передать в ProgreeBar и потом после обработки каждой строки делать инкремент готовности в ProgressBar
Передавайте в метод ссылку на BackgroundWorker и вызывайте его метод ReportProgress.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void bgw_ProgressChanged(object sender, ... e)
{
    progressBar1.Value = e.ProgressPercentage;
}
 
void bgw_DoWork(object sender, ... e)
{
    OtherMethod(sender as BackgroundWorker);
}
 
void OtherMethod(BackgroundWorker bgw)
{
    // какой-то код...
    bgw.ReportProgress(процент выполнения); // для обновления прогресс бара...
}
А зачем вам возвращать максимальное кол-во строк вообще не понятно, вам нужны проценты, а не количество строк, а в прогрессбаре ставите максимум 100.
0
12 / 12 / 3
Регистрация: 22.10.2010
Сообщений: 137
28.03.2017, 12:03  [ТС]
Большое спасибо за ответ!
Хотел уточнить, мне вторым элементом передавать BWG в мой класс?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            progressBar1.Value = 0;
            System.ComponentModel.BackgroundWorker worker = sender as System.ComponentModel.BackgroundWorker;
            // здесь я передаю путь для выполнения работы в другом классе
            workList_2.AddRange(csf.convertSelectetdFile(e.Argument.ToString()));
        }
 
 
 
//ваша рекомендация
void bgw_DoWork(object sender, ... e)
{
    OtherMethod(sender as BackgroundWorker);
}
 
void OtherMethod(BackgroundWorker bgw)
{
    // какой-то код...
    bgw.ReportProgress(процент выполнения); // для обновления прогресс бара...
}

т.е. получается я должен вот так сделать?
workList_2.AddRange(csf.convertSelectetd File(e.Argument.ToString()), sender as BackgroundWorker);


Добавлено через 32 минуты
Цитата Сообщение от Someone007 Посмотреть сообщение
А зачем вам возвращать максимальное кол-во строк вообще не понятно, вам нужны проценты, а не количество строк, а в прогрессбаре ставите максимум 100.
а как можно перевести это в проценты?
я подумал, что через событие можно вернуть перед началом преобразования максимальное число строки передать это значение в progressBar
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.03.2017, 12:03
Помогаю со студенческими работами здесь

Получить ID процесса если известно его хэндл, название окна или название процесса
а как получить ID процесса если известно его хэндл, название окна или название процесса?

BackgroundWorker
Уважаемые пользователи! Подскажите, пожалуйста, следующее: Есть программа, в которой протекают различные вычисления. Как на форму...

BackgroundWorker
Приветствую . Пытаюсь закодить проект с динамическим добавлением потоков , все бы хорошо , но я не могу вывести логи о работе в потоках в...

BackgroundWorker
Есть 10 button-ов и 1 backgroundWorker. При нажатии на любой button должен запускаться поток, в котором анализируется от какого button-а...

BackgroundWorker
Можно ли определить ProgressChanged для всех BackgroundWorker`ов? Или как осуществить подобное?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru