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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 18:41   #1
Alex_ua31
Новичок
Джуниор
 
Регистрация: 01.06.2010
Сообщений: 1
Восклицание Многопоточность WPF C#

На главной форме есть кнопка при нажатии создается новый поток:
private void button1_Click(object sender, RoutedEventArgs e)
Код:
{
Thread t = new Thread(delegate() { StartCoding(myDialog.FileName, "000000"); });
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
Код:
{
FileService FS = new des.FileService.FileService(file, code);
FS.Start();         
}
FileService это мой класс, в методе Start вызывается еще один метод StartCrypt и уже в этом методе идет вычисление в цикле. Перед мной стоит задача вывести проход в цикле на ПрогресБар в новом окне.
При создании окна перед циклом и обновлении его в цикле ничего не происходит и оно как бы "висит", после вычислений ПрогресБар сразу же полностью заполняется. Почитав пару статей вроде как нужно создавать окно с главного потока, а через класс Dispatcher как то передавать данные и обновлять ПрогресБар. Сам вопрос состоит где создавать новое окно и как обновлять ПрогресБар?
Alex_ua31 вне форума Ответить с цитированием
Старый 04.06.2012, 02:43   #2
Genco
Пользователь
 
Аватар для Genco
 
Регистрация: 16.11.2010
Сообщений: 46
По умолчанию

А классу точно нужно ещё одно, новое окно? Мб будет достаточно, если в фоне запустится дополнительный поток, который по ходу работы будет сообщать основному о прогрессе?

Если этого достаточно, то BackgroundWorker в помощь.

Создание в интерфейсе:
Код:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object wsender, DoWorkEventArgs arg)
         { /* параметры нужны этого типа, реализация по вкусу,смотря что там считаться будет*/ };
worker.RunWorkerCompleted += /*сюда обработчик конца вычислений*/ ;
worker.WorkerReportsProgress = true;
worker.ProgressChanged += /*Обработчик изменения прогресса, здесь можно обновить ProgressBar*/ ;
worker.RunWorkerAsync();
Только в расчетном потоке надо как-то дать знать о существовании worker-а, передать в конструкторе или присвоить в поле какое-нить, подойдет любое простое решение. И тогда в сами расчеты воткнуть вычисление прогресса, примерно так:
Код:
//для примера тут цикл, как именно заморочиться - дело индивидуальное
for(int i=0; i< N; i++)
{
   //считаем нечто навороченное
   worker.ReportProgress(100 * i / N);
   //рапортуем процент выполнения в основной поток
}
Детали на тему изящности или другие подробности можно нагуглить, но основная идея такая.
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться"

Последний раз редактировалось Genco; 04.06.2012 в 02:46.
Genco вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 15:00
WPF и многопоточность Selestis WPF, UWP, WinRT, XAML 2 26.05.2012 22:14
Многопоточность. Просветленный Общие вопросы Delphi 7 15.10.2011 15:44
многопоточность MasterSporta Общие вопросы C/C++ 4 30.09.2011 13:27
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10