Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 41

Проблемы с обновлением ProgressBar =(

08.08.2013, 17:31. Показов 4069. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При на нажатии на кнопку, запускается цикл которые обрабатывает символы из файлов. В этом же цикле пытаюсь вывести на прогрессБар завершенность процесса, но отрисовка происходит только по завершении обработки всех символов в файлах. Application.DoEvents(); не помогает, хотя возможно я не так его использую =)
Помогите люди добрые =)

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
82
83
84
85
86
87
88
89
        private void b_Start_Click(object sender, EventArgs e)
        {
            try
            {
                log = new StreamWriter(WF_PathLog, false, System.Text.Encoding.GetEncoding(1251));
            }
            catch
            {
                return;
            }
 
            try
            {
                writer = new StreamWriter(WF_PathOutput, false, System.Text.Encoding.GetEncoding(1251));
            }
            catch
            {
                log.WriteLine(DateTime.Now + "Ошибка записи файла");
                return;
            }
 
            for (int z = 0; z < WF_PathImputList.Count; z++)        //Подсчет общего колличества символов
            { 
                fileinfo = new FileInfo(WF_PathImputList[z]);
                AmountSimbolsTotal += (ulong)fileinfo.Length;
            }
 
            for (int i = 0; i < WF_PathImputList.Count; i++)        //Считывание списка файлов
            {
                try
                {
                    reader = new StreamReader(WF_PathImputList[i], System.Text.Encoding.GetEncoding(1251), false);
                }
                catch
                {
                    log.WriteLine(DateTime.Now + "Ошибка открытия файла");
                    return;
                }
                
                while ((SimbInt = reader.Read()) != -1)             //Считывание символов из файла списка
                {
                    if (SimbInt >= 1072 & SimbInt <= 1103)
                    {
                        SimbChar = (char)SimbInt;
                        writer.Write(SimbChar);
                        AmountSimbolsСounter++;
                        spaceDetect = false;
                    }
                    else if (SimbInt >= 1040 & SimbInt <= 1071)     // Определение строчных букв
                    {
                        SimbInt += 32;
                        SimbChar = (char)SimbInt;
                        writer.Write(SimbChar);
                        AmountSimbolsСounter++;
                        
                        spaceDetect = false;
                    }
                    else if (SimbInt == 32 & spaceDetect == false) // Определение пробелов
                    {
                        SimbChar = (char)SimbInt;
                        writer.Write(SimbChar);
                        AmountSpaсesСounter++;
                        spaceDetect = true;
                    }
 
                    AmountSimbolsTotalСounter++;
 
                }
                // Проблемы видимо начинаются тут: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                percentBarLong = (AmountSimbolsTotalСounter / AmountSimbolsTotal) * 100;
 
                progressBar1.Value = (int)percentBarLong;
                tb_percent.Text = percentBarLong + "%";
 
                Application.DoEvents();
 
                reader.Close();
                
            }
            
            log.WriteLine("Символов всего     : " + AmountSimbolsTotal);
            log.WriteLine("Символов всего обр : " + AmountSimbolsTotalСounter);
            log.WriteLine("Символов обработано: " + AmountSimbolsСounter);
            log.WriteLine("Пробелов выявлено  : " + AmountSpaсesСounter);
 
            writer.Close();
            log.Close();
 
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2013, 17:31
Ответы с готовыми решениями:

Проблемы с обновлением БД.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Проблемы с обновлением БД
Не могу изменить БД из приложения. Пишет &quot;Ошибка записи&quot;, что не так в запросе?? try { connection =...

Проблемы с обновлением грида
Здравствуйте, есть 2 грида. При выборе строки в первом гриде, меняются значения во втором. Также есть текстбокс, из которого по кнопке...

18
 Аватар для Art
153 / 153 / 56
Регистрация: 20.12.2011
Сообщений: 1,614
08.08.2013, 19:02
Почитайте про backgroundworker. Вроде как даже есть готовые примеры для прогресбара с использованием backgroundworker.
0
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 41
08.08.2013, 21:18  [ТС]
Пробовал, сам не разобрался с ним, и на форуме мне не помогли, бытовало даже мнение что бекгроундворкер для данной программы не годится. Раньше весь приведенный код был в отдельном классе, но так как БекГроундВоркер не помог я решил напрямую в Form программу сделать, и все равно не вышло, ужас =(
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
09.08.2013, 03:55
принудительная перерисовка формы не помогает?
C#
1
this.Refresh();
0
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 41
09.08.2013, 05:30  [ТС]
Цитата Сообщение от Cupko Посмотреть сообщение
принудительная перерисовка формы не помогает?
C#
1
this.Refresh();
Нет, не помогло =(
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
09.08.2013, 07:27
Держи, Студент
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
        private static int СountСharacters(string data, string pattern)
        {
            int result = 0;
            MatchCollection matchCollection = Regex.Matches(data, pattern, RegexOptions.Compiled|RegexOptions.IgnoreCase|RegexOptions.Singleline);
            foreach (Match match in matchCollection)
                result += match.Length;
            return result;
        }
 
        private IEnumerable<string> ReadFile(StreamReader reader)
        {
            while (!reader.EndOfStream)
                yield return reader.ReadLine();
        }
 
        private void TestMethod(string pathToLogs, StringCollection pathsToFiles)
        {
            long whiteSpace = 0;
            long amountSimbolsСounter = 0;
            long amountSimbolsTotal = 0;
            string patternWhiteSpace = " ";
            string patternLatin = "[a-z]+";
            string patternRussian = "[а-я]+";
            int index = 0;
            foreach (string path in pathsToFiles)
            {
                using (StreamReader reader = new StreamReader(path, Encoding.GetEncoding(1251)))
                    foreach (string data in ReadFile(reader))
                    {
                        amountSimbolsTotal += data.Length;
                        amountSimbolsСounter += (СountСharacters(data, patternLatin) +
                                                 СountСharacters(data, patternRussian));
                        whiteSpace += (data.Length - data.Replace(patternWhiteSpace, string.Empty).Length);
                    }
                progressBar1.Invoke((Action<int>)((int percent) => { progressBar1.Value = percent; }), Convert.ToInt32(((double)++index / (double)pathsToFiles.Count)*100));
                Application.DoEvents();
            }
            StringBuilder log = new StringBuilder();
            log.AppendFormat("Символов всего: {0}{1}", amountSimbolsTotal, Environment.NewLine);
            log.AppendFormat("Строчных всего: {0}{1}", amountSimbolsСounter, Environment.NewLine);
            log.AppendFormat("Пробелов всего: {0}{1}", whiteSpace, Environment.NewLine);
            File.WriteAllText(pathToLogs, log.ToString());
        }
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
09.08.2013, 10:17
Ну тогда уж так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void button1_Click(object sender, EventArgs e)
        {
            string fileName = "";
            ThreadPool.QueueUserWorkItem(o => LoadFile(fileName));
        }
 
        private void LoadFile(string fileName)
        {
            //Здесь загрузка из файла
 
            //Если надо изменить прогресс надо вызвать
            this.BeginInvoke(new Action<int>(changeProgress), 4);
        }
 
        private void changeProgress(int position)
        {
            //Здесь присваиваем значение прогресс бару
        }
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
09.08.2013, 20:30
ты думаешь что я не знаю про ThreadPool? причина по которой я предложил подобное решение в том что ТС может не знать или не понимать что такое ThreadPool
0
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 41
10.08.2013, 00:35  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
Держи, Студент
Это конечно круто дружище, но я тут ни черта не понимаю =(
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
10.08.2013, 02:50
кхм... "ничего не понимаю" - это слишком широко, конкретные вопросы в студию, любые, тогда и ответы будут конкретными
0
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 41
10.08.2013, 02:55  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
кхм... "ничего не понимаю" - это слишком широко, конкретные вопросы в студию, любые, тогда и ответы будут конкретными
Не вопрос, начну разбираться скоро с приведенным кодом, просто это несколько не то что я ожидал. Понимаю мой код далек от идеала, но хотелось бы именно его заставить работать. Разобраться в чем проблема.
Но все равно спасибо дружище =)
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
10.08.2013, 11:16
агерон, в моем сообщении нет ни слова про то, что кто то чего то не знает, я просто предложил решение. Использовать его или нет дело задающего вопрос.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
10.08.2013, 13:37
проблемы у тебя скорее всего начинаються тут
C#
1
while ((SimbInt = reader.Read()) != -1)
т. к. чтение по 1 символу это далеко не оптимальное решение если у тебя файл 1-2 мегабайта уже будут заметные тормоза т. к. программе фактически придеться сделать 1-2 миллиона обращений к диску а это поверь много... очень много...
я же читаю построчно что как минимум в 100-1000 раз уменьшает количество обращений к диску
+ твой не оптимальный код определения кода символа так же дает свою временную задержку т. к. он может повторяться все те же 1-2 миллиона раз.
Я же, даже с учетом "тяжелого" процесса разбора строки через Regex, использую более оптимальный алгоритм
+ ты суешь try/catch куда нужно и не нужно, это тоже играет роль.
По этому я тебе советую почитать книги по С#, чтобы не делать таких глупостей
0
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 41
11.08.2013, 06:30  [ТС]
Агерон думаю вы не совсем правы, данный метод обработки текста мне, так сказать, лично троэлсен посоветовал(книга по C#) =) К тому же запросов думаю гораздо меньше, за этим следит StreamReader. Мой алгоритм, файлы общим размером 10 Гб, обрабатывает за 10 мин. Может это и медленно но меня устраивает. Правда надо будет обрабатывать файлы общим весом 200 Гб, вот тут бы было не плохо уже знать сколько осталось то ждать.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
12.08.2013, 10:00
17 МБ текста в секунду? сильно при скорости сегодняшних винчестеров 80-100 MB в секунду? я уже молчу про SSD у которых скорость чтения достигает 300-500 MB в секунду, и да если ты обрабатываешь такое количество текста, может просто сперва слить все 10Гб в один файл а уж потом его проецировать в память? + подумай о таком изобретении человечества как базы данных вдруг и передумаешь велосипед писать
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.08.2013, 21:09
агерон, это линейная скорость... Со случайным доступом все печальнее. Вот конкретнве цифры моих винтов в ноуте
Миниатюры
Проблемы с обновлением ProgressBar =(   Проблемы с обновлением ProgressBar =(  
0
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 41
17.08.2013, 00:49  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
17 МБ текста в секунду? сильно при скорости сегодняшних винчестеров 80-100 MB в секунду? я уже молчу про SSD у которых скорость чтения достигает 300-500 MB в секунду, и да если ты обрабатываешь такое количество текста, может просто сперва слить все 10Гб в один файл а уж потом его проецировать в память? + подумай о таком изобретении человечества как базы данных вдруг и передумаешь велосипед писать
Ну я собственно программку и пишу чтобы она все 300000 тыс файлов слила в 1, заодно и отформатировала. А там уже обрабатывать можно. По поводу баз данных обойдусь XML для начала.
ПС. у меня не ССД да и веник 2 - 3 летней давности, так что наслаждаться мне приходится в лучшем случае 20 - 30 мб/сек.

И всеже отвлеклись от темы, есть идеи как заставить работать форму?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.08.2013, 00:54
Ну например маппить файл в память и туда записывать. Тогда будет использоваться ОЗУ под завязку, а на диск будет сбрасываться самой системой большими кусками, что опять же даст буст, т.к. линейное чтение вполне приличное у дисков.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.08.2013, 01:01
По крайней мере у меня он смог скушать всю доступную память (достаточно сделать приложение x64), если уж у вас такие огромные файлы, но вряд ли они размером с тысячекратной копией всей мировой литературы, а именно столько памяти я смог выделить:



Все-таки сборщик мусора молодец, я так и не смог больше 6.5гб выделить, хотя я память не освобождал. Видимо в критической ситуации он намного дальновиднее, чем может показаться Даже такой код его не сломил:
C#
1
2
3
4
5
6
7
8
            var n = int.MaxValue;
            var array = new object[n/9];
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = new object();
            }
            Console.WriteLine("Done");
            Console.ReadKey();
если взять хотя бы n/8, тут же вылетит OutOfMemoryException. Скорее всего это связанно с 8гб ОЗУ на ноуте + 1.5гб под систему. Остаются все те же 6.5гб
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.08.2013, 01:01
Помогаю со студенческими работами здесь

Проблемы с обновлением БД: не появляются новые поля
Здравствуйте. У меня не получается обновить базу данных. Все делаю по примеру: подключаю миграции, создаю миграции и обновляю бд. Но новые...

Проблема с обновлением progressbar
Решил попробовать сделать скаичвание файла сопровождающейся обновлением progressbar Сам файл скачивается, а программа завершает работу...

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

Проблемы с обновлением
1с БГУ 1.0. Файловая. Обновляю с версии 1.0.54.6 на 55.6. В конфигураторе обновление происходит без проблем. А вот после запуска...

Проблемы с обновлением OCR0
Пытаюсь в теле обработчика обновить OCR0, и не получается. Участок блока выделил &quot;PROBLEM BLOCK&quot; Алгоритм взял с примера...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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 На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru