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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2012, 22:11   #1
Villiya
 
Регистрация: 27.12.2011
Сообщений: 5
Печаль C# Ускорить Работу Backgroundworkerа

есть 3 строчки кода которые необходимо выполнить

Код:
/////данный кусок должен остаться неизменным
                CFirDoc p = new CFirDoc(id);               
                double TotalSeconds = p.Go();
                Form1.cdoc = p;
                ////
они являются очень временнозатратными т.е. в самом лучшем случае они расчитываются минут 5, чтобы не висла на это время форма, вынесла их в backgroundWorker следующим образом
Код:
private void CalcBtn_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
           
        }
       
        public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
 
               /////данный кусок должен остаться неизменным
                CFirDoc p = new CFirDoc(id);               
                double TotalSeconds = p.Go();
                Form1.cdoc = p;
                ////
                
 
                backgroundWorker1.ReportProgress(i);
            }           
        }
 
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }
 
        public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Работа завершена");
        }
процесс вроде выполняется, но ОООООЧЕНЬ медленно, может есть возможность его ускорить? может, например, лучше использовать
Код:
var thread = new Thread();
            thread.Start();
но как тогда в новом потоке правильно запустить
Код:
CFirDoc p = new CFirDoc(id);               
                double TotalSeconds = p.Go();
                Form1.cdoc = p;
и прикрутить к нему прогрессбар?

не отправляйте пожалуйста к литературе, уже было много перечитано, но что-то ничего не помогает
Villiya вне форума Ответить с цитированием
Старый 08.01.2012, 03:55   #2
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

а зачем 100 раз выполнять этот кусок в цикле? Потому и долго...
m0nax вне форума Ответить с цитированием
Старый 09.01.2012, 20:55   #3
Villiya
 
Регистрация: 27.12.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от m0nax Посмотреть сообщение
а зачем 100 раз выполнять этот кусок в цикле? Потому и долго...
для того чтоб сообщить прогрессбару процент выполнения
Код:
 backgroundWorker1.ReportProgress(i);
просто если попробовать запустить вот такое отображение процента выполнения
Код:
private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
            while (backgroundWorker1.IsBusy)
            {
                progressBar1.Increment(1);
                Application.DoEvents();
            }
}
то при запуске прогрессбар "заполняется" сразу и стоит на месте, а процесс работает сам по себе, т.е. в прогрессбаре реально не отображается ход вычислений
Villiya вне форума Ответить с цитированием
Старый 09.01.2012, 21:48   #4
Villiya
 
Регистрация: 27.12.2011
Сообщений: 5
По умолчанию

возможно ли для данного случая использовать ThreadPool? если да, то каким образом будет выглядеть код? что-то типа такого?
Код:
private void CalcBtn_Click(object sender, EventArgs e)
        {
           ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
           
        }
 static void ThreadProc(Object stateInfo) 
{
        CFirDoc p = new CFirDoc(id);               
                double TotalSeconds = p.Go();
                Form1.cdoc = p;
    }
но как тогда в этом случае отобразить ход вычислений на прогрессбаре? и вообще сообщить пользователю что вычисления закончены?
Villiya вне форума Ответить с цитированием
Старый 09.01.2012, 22:53   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну и зачем вы запускаете ваше вычисление сто раз?
судя по всему вы не можете оценить состояние одного вычисления.

значит нужно использовать "изображение действия неопределенной длительности".
например как при поиске в проводнике.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.01.2012, 22:58   #6
Villiya
 
Регистрация: 27.12.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
значит нужно использовать "изображение действия неопределенной длительности".
например как при поиске в проводнике.
а можно хотя б приблизительный код как это делается?
Villiya вне форума Ответить с цитированием
Старый 09.01.2012, 23:04   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

обычная анимация например, тут надо решить немного как отображать то будете.
на самом деле может сойти даже надпись "вычисляю..."
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.01.2012, 23:19   #8
Villiya
 
Регистрация: 27.12.2011
Сообщений: 5
По умолчанию

ну была идея стандартно отбразить ход выполнения в прогрессбар, может даже установить ему мин значение 0, а максимальное - TotalSeconds
Код:
double TotalSeconds = p.Go();
TotalSeconds - это реальное время занимаемое вычислениями, ну а потом как-то в цикле от 0 до TotalSeconds передавать "процент" выполнения на прогрессбар, но что-то видимо не продумано, если на самом деле получается что я в цикле 100 раз выполняю одни и те же вычисления...
Villiya вне форума Ответить с цитированием
Старый 10.01.2012, 18:26   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы максимум можете после вычисления сказать сколько оно заняло времени(если я правильно понял значение результата функции)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить работу БД SERG1980 БД в Delphi 9 09.11.2010 23:30
Ускорить работу с БД Poltev86 БД в Delphi 2 25.05.2010 09:46
ускорить работу макроса borik120 Microsoft Office Excel 12 19.01.2010 17:25
Как ускорить работу программы SibBear Общие вопросы Delphi 7 27.03.2009 14:40
помогите ускорить работу программы... Pashtet Паскаль, Turbo Pascal, PascalABC.NET 5 25.11.2008 22:12