Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Alex_ua31
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 2
1

Показывать ProgressBar вычислений, запущенных в отдельном потоке

03.06.2012, 18:32. Просмотров 2305. Ответов 3
Метки нет (Все метки)

На главной форме есть кнопка при нажатии создается новый поток:
C#
1
2
3
4
5
6
private void button1_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(delegate() { StartCoding(myDialog.FileName, "000000"); });
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
C#
1
2
3
4
{
FileService FS = new des.FileService.FileService(file, code);
FS.Start();         
}
FileService это мой класс, в методе Start вызывается еще один метод StartCrypt и уже в этом методе идет вычисление в цикле. Перед мной стоит задача вывести проход в цикле на ПрогресБар в новом окне.
При создании окна перед циклом и обновлении его в цикле ничего не происходит и оно как бы "висит", после вычислений ПрогресБар сразу же полностью заполняется. Почитав пару статей вроде как нужно создавать окно с главного потока, а через класс Dispatcher как то передавать данные и обновлять ПрогресБар. Сам вопрос состоит где создавать новое окно и как обновлять ПрогресБар?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 18:32
Ответы с готовыми решениями:

ProgressBar в отдельном потоке
Кинул на форму бутонку прогрессБар и тот элемент с не выговариваемым названием...

Выполнение длительных вычислений и операций в отдельном потоке
Добрый вечер. Возникла проблема с вычислениями. Из базы данных (файл)...

Окно в отдельном потоке
Привет, вопрос заключается в том как поступить. У меня есть редактор карт для...

Таймер не запускается в отдельном потоке
У меня есть поток, в котором в при определенных условиях должен запустится...

Очередь сообщений в отдельном потоке
В продолжение темы http://www.cyberforum.ru/csharp-net/thread811472.html Мне...

3
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
03.06.2012, 22:48 2
через Dispatcher.Invoke это делается. У любого компонента это есть
0
Unril
789 / 680 / 109
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
04.06.2012, 00:57 3
Используй класс BackgroundWorker и не изобретай велосипеды. У него есть метод ReportProgress и событие ProgressChanged, которые позволяют легко организовать вывод прогресса выполнения необходимой работы. Тем более, он использует пул потоков, а не создаёт лишние потоки в системе, расходуя тем самым ресурсы.
0
Alex_ua31
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 2
04.06.2012, 16:46 4
Цитата Сообщение от Unril Посмотреть сообщение
Используй класс BackgroundWorker и не изобретай велосипеды. У него есть метод ReportProgress и событие ProgressChanged, которые позволяют легко организовать вывод прогресса выполнения необходимой работы. Тем более, он использует пул потоков, а не создаёт лишние потоки в системе, расходуя тем самым ресурсы.

Сегодня в три ночи получилось сделать через BackgroundWorker.
Что сделал, передал с главной формы на вторую через конструктор параметры:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Encrypting(String _file, String _code)
        {
            InitializeComponent();
            file = _file;
            code = _code;
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
            backgroundWorker1.DoWork +=
                new DoWorkEventHandler(backgroundWorker1_DoWork);
            backgroundWorker1.RunWorkerCompleted +=
                new RunWorkerCompletedEventHandler(
            backgroundWorker1_RunWorkerCompleted);
            backgroundWorker1.ProgressChanged +=
                new ProgressChangedEventHandler(
            backgroundWorker1_ProgressChanged);
        }
Дальше сама работа:
C#
1
2
3
4
5
6
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            
            FileService FS = new des.FileService.FileService(file, code, sender);
            FS.Start();
        }
В методе Start вызывается метод StartCrypt и в нем идет шифровка файла, в зависимости от размера файла (количества блоков) и определяется количество раз выполнения цикла.
C#
1
2
3
4
5
6
7
for (int i = 0; i < m_CountBlocks64; i++)
            {
               
                worker.ReportProgress(значение прогресса);
                m_FileR.Read(array, offset, count);
                FullBlockCrypt(array);
            }
Теперь возникает проблема, я бы передал m_CountBlocks64 ПрогрессБару что бы установить как максимум, но не знаю как, и что то мне подсказывает что класс BackgroundWorker в этом не поможет. Или я не прав, что делать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2012, 16:46

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

Выполнение действия в отдельном потоке
Привет! Вообщем, со своими лоу знаниями в C#, я столкнулся с проблемой во...

Выполнение метода в отдельном потоке
Необходимо выполнить метод Search (или всю операцию message =...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru