Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2014, 16:12   #1
Antony22
 
Регистрация: 10.01.2014
Сообщений: 6
По умолчанию Подскажите пожалуйста в чем ошибка

Доброго времени суток пытаюсь сделать прогресбар для функции подскажите пожалуйста где ошибся:
Код:
public delegate void ModifyProgressBarDelegate(int max, int val);
        public static void ModifyProgressBarMethod(int max, int val)
        {
            progressBar1.Maximum = max; //ругается на progressBar1
            progressBar1.Value = val;
        }
        protected static List<string> FileINFolder(string patch)
        {
            var dir = new DirectoryInfo(patch);
            var files = new List<string>();
            bool x = false;
            int max = files.Count;
            int val = 0;
            Thread b = new Thread(() => progressBar1.Invoke(new ModifyProgressBarDelegate(ModifyProgressBarMethod), max, val));
            b.Start();
            foreach (FileInfo file in dir.GetFiles())
            {
                if (file.Extension == ".xml")
                {
                    x = true; 
                    files.Add(file.FullName);
                }
                val++;

            }
            if (x == false)
            {
                System.Windows.MessageBox.Show("Не найдены файлы!");
            }

            return files;
        }

Последний раз редактировалось Antony22; 16.01.2014 в 16:22.
Antony22 вне форума Ответить с цитированием
Старый 16.01.2014, 16:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если я правильно понимаю у тебя в Thread идет анонимная функция, где нет цикла.
Она отрабатывает один раз progressBar1.Invoke и тред завершается.
Думаю тебе нужно в треад запулить сам цикл, и в нем вызывать прогрессбарное отрисовывание.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.01.2014, 16:43   #3
Antony22
 
Регистрация: 10.01.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если я правильно понимаю у тебя в Thread идет анонимная функция, где нет цикла.
Она отрабатывает один раз progressBar1.Invoke и тред завершается.
Думаю тебе нужно в треад запулить сам цикл, и в нем вызывать прогрессбарное отрисовывание.
Да было бы неплохо вот только если можно примерчик пожалуйста а я просто смутно представляю как это сделать.
Antony22 вне форума Ответить с цитированием
Старый 16.01.2014, 18:38   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Увы я с Шарпом не дружу настолько.
Основные принципы знаю, а примеры из MSDN черпаю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.01.2014, 20:18   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Я верно понимаю, что у вас WPF или Silverlight приложение?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 17.01.2014, 09:23   #6
Antony22
 
Регистрация: 10.01.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Увы я с Шарпом не дружу настолько.
Основные принципы знаю, а примеры из MSDN черпаю.
Жаль, все равно спасибо хоть буду знать в каком направлении капать
Я пытался и сейчас пытаюсь найти на MSDN подходящий пример но пока безуспешно. Возможно просто ищу плохо или не понимаю до конца.

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Я верно понимаю, что у вас WPF или Silverlight приложение?
Верно у меня WPF приложение.

Последний раз редактировалось Antony22; 17.01.2014 в 09:30.
Antony22 вне форума Ответить с цитированием
Старый 17.01.2014, 12:48   #7
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

1) В отдельный поток следует вынести процесс поиска файлов и заполнения списка "files" (иначе UI не будет ни на что реагировать в процессе поиска, в т.ч. не будет отображать прогресс на progressbar'е). Кстати, проще использовать "Directory.EnumerateFiles(path, "*.xml")"

2) У прогрессбара свойства "Max" и "Value" забиндить на соответствующие свойства, которые вы создадите в вашем классе. Для обновления прогрессбара достаточно будет сгенерировать событие NotifyPropertyChanged с указанием имени свойства "Value"

3) Все это изначально не имеет ни малейшего смысла, т.к. вся долгая работа по поиску файлов выполняется при вызове "dir.GetFiles()", работу которого по прогрессбару не отследить. Все остальное (в т.ч. цикл, в к-ром вы перебираете найденные файлы) выполняется за миллисекунды => прогрессбар никто и увидеть не сумеет

P.S. да и прогрессбар у вас всегда будет показывать 100% из-за того, что вместо "int max = files.Count;" нужно было использовать "dir.GetFiles().Length". Хотя согласно п.3 ничего использовать и вовсе не надо было
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 20.01.2014, 13:53   #8
Antony22
 
Регистрация: 10.01.2014
Сообщений: 6
По умолчанию

Luuzuk, большое вам спасибо за доходчивое объяснение попробую переписать функцию согласно вашим советам.
Antony22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите, в чем ошибка? St@ter Помощь студентам 3 29.09.2013 15:02
Подскажите, в чем ошибка. V888 Общие вопросы C/C++ 1 19.12.2009 12:44
Пожалуйста, подскажите в чем у меня ошибка? wepoTWR Помощь студентам 8 09.12.2009 22:34
Подскажите, в чем ошибка? Cannibal Помощь студентам 1 23.11.2008 12:50
Подскажите пожалуйста чем удобнее воспользоваться для поиска нужного значения Ivo4ka Microsoft Office Excel 9 01.10.2007 20:17