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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2008, 13:49   #1
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию поток и progressbar

может у кого-нибудь есть пример использования потока и progressbar
например: копирование файла... чтобы progressbar отображал насколько скопирован файл...

заранее благодарен
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 26.12.2008, 12:05   #2
OrdJONY
.NET-чик
Форумчанин
 
Аватар для OrdJONY
 
Регистрация: 24.03.2007
Сообщений: 569
По умолчанию

для простых операций вам хватит BackgroundWorker-а
Код:
            worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true; //Включаем поддержку изменения состояния и вызова события ProgressChanged
            worker.WorkerSupportsCancellation = true; //Включаем поддержку отмены
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerAsync(); //стартует работу BackGroundWorker и возбуждает DoWork в новом потоке
            worker.CancelAsync(); //завершает работу, но даже если прервать работу BackgroundWorker событие RunWorkerCompleted всеравно вызовется
        }

        static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //Узнаем на сколько процентов готово или любую другую информацию можно поместить
        }

        static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //Вызывается этот обработчик когда работа BackgroundWorker-а закончена
            if (e.Cancelled)
            {
                Console.WriteLine("Работа прервана пользователем");
            }
        }

        static void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            //Выполняем что-то в отдельном потоке ...
            //Вызываем функцию которая оповещает основной поток о ходе выполнения. Второй параметр необязателен, это пользовательская информация
            worker.ReportProgress(50, new object());
            //Проверяем не была ли прервана операция
            if (worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            //когда закончили результат работы можно вернуть
            e.Result = new object();
        }
Если что-то непонятно, спрашивайте
"Разработка под веб - как работа с пылесосом: нихрена не прикольно, но засасывает"
Мо маленький городок
OrdJONY вне форума Ответить с цитированием
Старый 27.12.2008, 01:33   #3
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

как передать процент выполнения на прогресбар?
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 27.12.2008, 01:35   #4
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

и как привязать эти функции к какому либо процессу?
может есть отдельный пример... в архиве.
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 27.12.2008, 18:25   #5
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

писать код не буду, уж пардон....... но идея такая..... внутри нового потока создается переменная, в которую в процессе выполнения этого потока передаешь данные (проценты например), запускаешь поток и таймер с малым интервалом.... в событии таймера устанавливаешь процент програссбара равным созданной в потоке переменной..... Я делал так всегда. И нормально)
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 27.12.2008, 18:55   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Вот как-то так с воркером
Вложения
Тип файла: rar worker.rar (11.5 Кб, 139 просмотров)
pu4koff вне форума Ответить с цитированием
Старый 27.12.2008, 19:55   #7
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

pu4koff, спасибо, из твоего примера всё понятно
вчера слил с msdn пример воркера
прога вычисляет число фибоначи... так из неё не понятно как это всё работает
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 29.12.2008, 00:20   #8
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

pu4koff, а как его связать скажем с File.Copy()???
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 29.12.2008, 00:21   #9
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

кстати в твоём примере если цикл сделать не 100 а 101, то вылетает ошибка т.к. прогрессбар 101 не поддерживает
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 29.12.2008, 09:33   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от TaTT DoGG Посмотреть сообщение
pu4koff, а как его связать скажем с File.Copy()???
никак.
Копирование делать примерно так:
1) Создаём новый файл
2) Копируем из исходного файла килобайт данных (килобайт можете по своему усмотрению поменять на другой объём)
3) Записываем в новый файл этот килобайт информации
4) В прогрессбаре указываем сколько процентов прошло (размер исходного файла и записанный в новый файл объем информации мы знаем).
5) Проверяем. не отменил ли пользователь операцию и если что удаляем новый файл и выходим
6) Переходим на шаг 2, если исходный файл еще не кончился
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поток Черничный Общие вопросы Delphi 5 27.09.2008 21:23
Поток в никуда... prizrak1390 Работа с сетью в Delphi 1 30.06.2008 10:32
Убить поток Баламут Общие вопросы Delphi 3 22.03.2008 05:04