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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> progress bar, C# 
:(
    Опции темы
Gorlum
Дата 11.5.2005, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Идет заливка из экселя в MSSQL, происходит это давольно долго, помогите сделать прогресс бар для этого процесса
PM MAIL ICQ   Вверх
Kurt
Дата 11.5.2005, 23:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



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


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Gorlum
Дата 12.5.2005, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С прогресс барами не работал воще, поэтому:
Как узнать что нада прогресс бар нада сместить (что для цикла, что для потока, с потоками воще у меня туго), и как его реализовать (всмысле при каждом добавлении процента выполнения обновлять экан чтобы добавить кубик и изменить процент?)
PM MAIL ICQ   Вверх
-ser-
Дата 12.5.2005, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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 );



--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Gorlum
  Дата 12.5.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(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
PM MAIL ICQ   Вверх
AntonSaburov
Дата 12.5.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Вот тебе простенький пример с потоками. Если запустишь - видно что циферки выводятся не по очереди а в перемешку. Т.е. печать происходит как бы одномоментно. Получается параллельная работа. Как раз на этом и можно играть - в одном потоке заполняешь 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);
            }
        }
    }
}


PM MAIL WWW ICQ   Вверх
Gorlum
Дата 12.5.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ок, понятно, спасиба, а как при этом узнать процент выполнения задания?
PM MAIL ICQ   Вверх
AntonSaburov
Дата 12.5.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



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

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

В таком случае просто заводится переменная, которая глобальна для обоих потоков. Один поток, который читает данные регулярно обновляет эту переменную (пишет туда число, которое в какой-то мере показывает процент считанных данных), а другой - регулярно читает. Можно делать чтение менее нагруженным - например делать задержку в потоке при чтении этой переменной, и не писать постоянно при чтении данных.
PM MAIL WWW ICQ   Вверх
Gorlum
Дата 12.5.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дюже большое спасиба, на плюсик кликнуть не получилося, мало постов smile.

Это сообщение отредактировал(а) Gorlum - 12.5.2005, 20:02
PM MAIL ICQ   Вверх
anonym
Дата 30.6.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А у меня программа рекурсивно просматривает все файлы в заданном каталоге и выполняет с ними определённые действия. Как в этом случае рассчитать, сколько осталось работы? Есть ли вообще какое-то решение?
PM MAIL   Вверх
Sanguine
Дата 1.7.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно посчитать все файлы,  и делать среднюю оценку затрат времени на обработку одного. Или примерно прикинуть время как функцию от размера обрабатываемого файла. Точного решения до сих пор не существует, насколько мне известно.
PM MAIL   Вверх
anonym
Дата 3.7.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хмм... ясно... я в общем-то так и думал... Йэх... Будем считать файлы)
PM MAIL   Вверх
alhimik
Дата 22.7.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Каким образом это сделать? Переменную по ссылке как аргумент?
PM ICQ   Вверх
mr.DUDA
Дата 23.7.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



alhimik, обычное поле класса, с которым могут работать функции обоих потоков.


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

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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