Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> потоки и progressbar, И чтоб прога не висла пока работает 
:(
    Опции темы
jackfall
Дата 5.2.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 27.12.2008

Репутация: нет
Всего: нет



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

Это из примеров кажется в MSDN взял, чуть переделал (именно кусок который делает работу):

Код

//Загрузка картинки для сохранения..., указание размера
Bitmap bm1 = new Bitmap(Image.FromFile(file), size);
ImageCodecInfo jpegCodecInfo = GetEncoderInfo("image/jpeg");
//Установка параметров
EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, getQuality(quality));
EncoderParameters codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
//Собственно сохранение..
bm1.Save(name, jpegCodecInfo, codecParams);
bm1.Dispose();


Я так понимаю именно операции загрузки и записи занимают время достаточное чтобы приложение не откликалось (если несколько файлов то тем более).
Надо бы както сделать чтоб нормально было)

Читаю тему думаю полезную Тут
Но всё равно нужна помощь)
PM MAIL   Вверх
Partizan
Дата 5.2.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



jackfall, пример работы с потоками:

http://msdn.microsoft.com/en-us/library/sy...hreadstart.aspx

прогрессбар на форме можно будет обновить из левого потока через Invoke ;)



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Drabuna
Дата 5.2.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дивелоперчег
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: 3



Ещё вопрос, есть метод
Код

public void percentresize(string[] files, double factor)

Возможно ли его запустить в новом потоке и передать параметры каким то образом?
PM MAIL   Вверх
Partizan
Дата 5.2.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Drabuna, используйте ParameterizedThreadStart, в качестве аргумента при старте потока передавайте массив из двух объектов

Код

string[] files = new string[]{"1.txt", "2.txt"};
myThread.Start(new object[2]{files, 0.1});





--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Drabuna
Дата 6.2.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дивелоперчег
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: 3



Код

              Thread newThread = new Thread(new ParameterizedThreadStart(percentresize));
               newThread.Start(new object[2]{files, rate});


Получаю ошибку во время компиляции
Код

Error    1    No overload for 'percentresize' matches delegate 'System.Threading.ParameterizedThreadStart'


PM MAIL   Вверх
Partizan
Дата 6.2.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Drabuna, а percentresize пускай принимает object[] и внутри проверяет количество объектов в массиве и их типы/приводипость к типам


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
QryStaL
Дата 6.2.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Drabuna, можно использовать анонимный метод и замыкание...


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Drabuna
Дата 6.2.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дивелоперчег
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: 3



Чувствую я себя дебилом)))) Можно по-подробнее?) smile 
PM MAIL   Вверх
Partizan
Дата 6.2.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Drabuna, 

как-то так:
Код

...
string[] files = new string[]{"1.txt", "2.txt"};
double factor = 0.8;

Thread thread = new Thread( 
                                  new ThreadStart(
                                        delegate()
                                        {
                                               percentresize(files, factor);
                                        }
                                  )
                           );

...


Это сообщение отредактировал(а) Partizan - 6.2.2009, 12:47


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
QryStaL
Дата 6.2.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Код

/// <summary>
/// Собственно метод
/// </summary>
/// <param name="files"></param>
/// <param name="factor"></param>
public void percentresize(string[] files, double factor)
{
    // 
}

/// <summary>
/// Запуск percentresize с использованием анонимных методов C# 2 (и выше)
/// </summary>
/// <param name="files"></param>
/// <param name="factor"></param>
public void ThreadedPercentResize(string[] files, double factor)
{
    new Thread(new ThreadStart(
        delegate()
        {
            percentresize(files, factor);
        }
    )).Start();
}

/// <summary>
/// Запуск percentresize с использованием лямбда-выражений C# 3 (и выше)
/// </summary>
/// <param name="files"></param>
/// <param name="factor"></param>
public void ThreadedPercentResize2(string[] files, double factor)
{
    new Thread(() => percentresize(files, factor)).Start();
}



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Drabuna
Дата 6.2.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дивелоперчег
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 27.3.2008
Где: Киев

Репутация: нет
Всего: 3



Во, спасибо)  smile  smile  smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.