Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > progress bar


Автор: Gorlum 11.5.2005, 18:49
Идет заливка из экселя в MSSQL, происходит это давольно долго, помогите сделать прогресс бар для этого процесса

Автор: Kurt 11.5.2005, 23:25
Не понимаю проблемы.
Если у вас заливка происходит в каком-нибудь цикле - смещайте ProgressBar при каждой итерации.
Если же вся заливка происходит одной командой - работайте через потоки. В одном потоке запустите команду на заливку базы, а в другом - смещение ProgressBar'a.

Автор: Gorlum 12.5.2005, 00:42
С прогресс барами не работал воще, поэтому:
Как узнать что нада прогресс бар нада сместить (что для цикла, что для потока, с потоками воще у меня туго), и как его реализовать (всмысле при каждом добавлении процента выполнения обновлять экан чтобы добавить кубик и изменить процент?)

Автор: -ser- 12.5.2005, 07:57
Код

progressBar1.Minimum = 0;
progressBar1.Maximum = 10000;
progressBar1.Step = 1;

for (int i = 0; i <= 10000; i++)
   progressBar1.PerformStep();
            
for (int i = 0; i <= 2500; i++)
   progressBar1.Value -= 4;

progressBar1.Value = 10;
            
for (int i = 0; i <= 8000; i++)
    progressBar1.Increment( 1 );

Автор: Gorlum 12.5.2005, 15:15
Цитата(ser @ 12.5.2005, 07:57)
Код

progressBar1.Minimum = 0;
progressBar1.Maximum = 10000;
progressBar1.Step = 1;

for (int i = 0; i <= 10000; i++)
   progressBar1.PerformStep();
            
for (int i = 0; i <= 2500; i++)
   progressBar1.Value -= 4;

progressBar1.Value = 10;
            
for (int i = 0; i <= 8000; i++)
    progressBar1.Increment( 1 );

Ниче не понимаю smile

я пока понапридумывал такое:

определить общее количество строк в экселевском файле

цикл
залить строчку
количество строк закачано
% = округлить(100 * количество строк закачано/ общее количество строк)
показать прогрес бар

но я так подозреваю что есть методы проще и быстрее (бастрее потомушо заливаются несколько миллионов строк)

Есть ли в C# стандартные методы для этого процесса, или как выполнить это потоками smile например уменя фсе это дело выполняется в функции ExelToSql() smile

Автор: AntonSaburov 12.5.2005, 17:13
Вот тебе простенький пример с потоками. Если запустишь - видно что циферки выводятся не по очереди а в перемешку. Т.е. печать происходит как бы одномоментно. Получается параллельная работа. Как раз на этом и можно играть - в одном потоке заполняешь Excel, а в другом показываешь какие-то штучки на прогресс баре.

Код

using System;
using System.Threading;

namespace ConsoleApplication1
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: Add code to start application here
            //
            Class1 class1 = new Class1();
            class1.startExcel("1");
            class1.startExcel("2");
            class1.startExcel("3");
            class1.startExcel("4");
            class1.startExcel("5");
        }

        public void startExcel(string name)
        {
            Work w = new Work(name);
            Thread t = new Thread(new ThreadStart(w.DoWork));
            t.Start();
        }
    }

    class Work
    {
        private string m_name;
        public Work(string name)
        {
            m_name = name;
        }
        public void DoWork()
        {
            for(int i=0; i<10000; i++) 
            {
                Console.WriteLine("Thread is working:"+m_name);
            }
        }
    }
}


Автор: Gorlum 12.5.2005, 17:44
Ок, понятно, спасиба, а как при этом узнать процент выполнения задания?

Автор: AntonSaburov 12.5.2005, 18:52
Цитата(Gorlum @ 12.5.2005, 17:44)
а как при этом узнать процент выполнения задания?

Это одно из самых проблематичных вариантов, если заранее неизвестно количество строк. Но будем считать, что в какой-то мере оценить это количество можно (хотя бы по размеру файла). Пусть даже приблизительно.

В таком случае просто заводится переменная, которая глобальна для обоих потоков. Один поток, который читает данные регулярно обновляет эту переменную (пишет туда число, которое в какой-то мере показывает процент считанных данных), а другой - регулярно читает. Можно делать чтение менее нагруженным - например делать задержку в потоке при чтении этой переменной, и не писать постоянно при чтении данных.

Автор: Gorlum 12.5.2005, 20:02
Дюже большое спасиба, на плюсик кликнуть не получилося, мало постов smile.

Автор: anonym 30.6.2007, 19:52
А у меня программа рекурсивно просматривает все файлы в заданном каталоге и выполняет с ними определённые действия. Как в этом случае рассчитать, сколько осталось работы? Есть ли вообще какое-то решение?

Автор: Sanguine 1.7.2007, 10:19
Можно посчитать все файлы,  и делать среднюю оценку затрат времени на обработку одного. Или примерно прикинуть время как функцию от размера обрабатываемого файла. Точного решения до сих пор не существует, насколько мне известно.

Автор: anonym 3.7.2007, 15:23
Хмм... ясно... я в общем-то так и думал... Йэх... Будем считать файлы)

Автор: alhimik 22.7.2007, 21:24
Цитата(AntonSaburov @  12.5.2005,  17:52 Найти цитируемый пост)
В таком случае просто заводится переменная, которая глобальна для обоих потоков.

Каким образом это сделать? Переменную по ссылке как аргумент?

Автор: mr.DUDA 23.7.2007, 10:16
alhimik, обычное поле класса, с которым могут работать функции обоих потоков.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)