Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ProgressBar от 0 до 10 000 000 - "Тормознуто"

490
11 февраля 2008 года
frid-karatel
357 / / 15.09.2007
На форме расположен ProgressBar с значением 0-100.

Вычисляется цикл от 1 до 10 000 000. Как сделать более разумным движение статуса на ProgressBar'e?

Делаю я сейчас примерно так:
 
Код:
int b = 0;
int step = 10 000 000 / 100;
for (int i = 0; i < 10 000 000; i++)
{
  if (i > step * b)
  {
    b++;
    Form1->ProgressBar1->Position++;
  }
}


Но получается, что слишком много времени затрачивается на обработку не столько ProgressBar'а, сколько на сравнение.
Думал выделить это в отдельный поток или по таймеру (скажем, в 1 сек) сверять. Но бывает так, что цикл вычисляется за 2-3 секунды (если не 10 000 000, а всего 1000) - тогда ProgressBar не очень красиво "дергается", хочется плавности...

Что посоветуете мне в решении этого вопроса?
1.9K
12 февраля 2008 года
Anton Chik
175 / / 26.09.2005
как ты умудряешься прогонять цикл до 1e7 если int способен сосчитать тока до 32767?)

по-моему ничо не поделаешь, можно лишь упростить условие до

 
Код:
int step = 1e5;
for (i = 0; i < 1e7; i++)
{
  if (i > step)
  {
    step+=1e5;
    Form1->ProgressBar1->Position++;
  }
}
240
12 февраля 2008 года
aks
2.5K / / 14.07.2006
Цитата: Anton Chik
если int способен сосчитать тока до 32767?)


Кто тебе такую чушь сказал - int как и любой тип в C++ не завязан на разрядность, количество байт и.т.п.

Но тем не менее в 32-х разрядных системах и компиляторах для них (да и в 64-х разрядных тоже) принято под int выделять 4 байта. Соответсвенно возможных вариантов значений там 2^32.
А то что ты написал - это для давно уже невыпускающихся 16-тибитных компов и древних уже неисспользуемых компиляторов для них.

11
12 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: frid-karatel
На форме расположен ProgressBar с значением 0-100.

Вычисляется цикл от 1 до 10 000 000. Как сделать более разумным движение статуса на ProgressBar'e?

Делаю я сейчас примерно так:
 
Код:
int b = 0;
int step = 10 000 000 / 100;
for (int i = 0; i < 10 000 000; i++)
{
  if (i > step * b)
  {
    b++;
    Form1->ProgressBar1->Position++;
  }
}


Но получается, что слишком много времени затрачивается на обработку не столько ProgressBar'а, сколько на сравнение.
Думал выделить это в отдельный поток или по таймеру (скажем, в 1 сек) сверять. Но бывает так, что цикл вычисляется за 2-3 секунды (если не 10 000 000, а всего 1000) - тогда ProgressBar не очень красиво "дергается", хочется плавности...

Что посоветуете мне в решении этого вопроса?



А нельзя ли так?:

 
Код:
Form1->ProgressBar1->Max = 10 000 000; // здесь переменная, содержащая количество шагов цикла
цикл
Form1->ProgressBar1->Position++;
цикл

и поместить это в отдельный процесс
490
12 февраля 2008 года
frid-karatel
357 / / 15.09.2007
Цитата: oxotnik333
А нельзя ли так?:
 
Код:
Form1->ProgressBar1->Max = 10 000 000; // здесь переменная, содержащая количество шагов цикла
цикл
Form1->ProgressBar1->Position++;
цикл

и поместить это в отдельный процесс


Да, но в чем разница - выполнять в отдельном процессе или нет? функция-то все равно будет обрабатывать цикл, причем, как мне кажется, этот вариант даже медленней, ведь мы фактически обращаемся к компоненту на форме, т.е. сначала инициализируем форму, потом компонент, а потом уже свойство... это уменьшает скорость...

У меня есть вариант:

Код:
int a;
int b;
for (a = 0; a < 10 000 000; a++)
{
  for (b = a; b < a + 1000; b++)
  {
    //Выполнять код
    //Form1->ProgressBar1->Progress++;
  }
  a += b;
}


Таким образом, можно определить второй цикл вообще как for (b = a; b < a + MAX / STEPS; b++)...

Я думаю, что это на данный момент самый оптимальный вариант из всех...
3
12 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: frid-karatel

У меня есть вариант:
Код:
int a;
int b;
for (a = 0; a < 10 000 000; a++)
{
  for (b = a; b < a + 1000; b++)
  {
    //Выполнять код
    //Form1->ProgressBar1->Progress++;
  }
  a += b;
}


Таким образом, можно определить второй цикл вообще как for (b = a; b < a + MAX / STEPS; b++)...

Я думаю, что это на данный момент самый оптимальный вариант из всех...


Тогда уж

Код:
int a;
int b;
for (a = 0; a < 10 000 000;)
{
  for (b = a; b < a + 1000; b++)
  {
    //Выполнять код
  }
  a = b;
  Form1->ProgressBar1->Progress++;
}

или тогда уж
 
Код:
for (int a = 0; a < 10 000 000/1000; a++)
{
  for (int b = 0; b < 1000; b++)
  {
    //Выполнять код
  }
  Form1->ProgressBar1->Progress++;
}
11
12 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: frid-karatel
Да, но в чем разница - выполнять в отдельном процессе или нет? функция-то все равно будет обрабатывать цикл, причем, как мне кажется, этот вариант даже медленней, ведь мы фактически обращаемся к компоненту на форме, т.е. сначала инициализируем форму, потом компонент, а потом уже свойство... это уменьшает скорость...

У меня есть вариант:
Код:
int a;
int b;
for (a = 0; a < 10 000 000; a++)
{
  for (b = a; b < a + 1000; b++)
  {
    //Выполнять код
    //Form1->ProgressBar1->Progress++;
  }
  a += b;
}


Таким образом, можно определить второй цикл вообще как for (b = a; b < a + MAX / STEPS; b++)...

Я думаю, что это на данный момент самый оптимальный вариант из всех...



ключевая мысль была уйти от операции сравнения, а как и где реализовать этот код, это уже другая задача, если в потоке, то не надо будет маяться с перерисовкой формы

490
12 февраля 2008 года
frid-karatel
357 / / 15.09.2007
Цитата: Green
Тогда уж
Код:
int a;
int b;
for (a = 0; a < 10 000 000;)
{
  for (b = a; b < a + 1000; b++)
  {
    //Выполнять код
  }
  a = b;
  Form1->ProgressBar1->Progress++;
}


Я опечатался просто :) Не туда вставил прибавление прогресса...

Цитата: Green

или тогда уж
 
Код:
for (int a = 0; a < 10 000 000/1000; a++)
{
  for (int b = 0; b < 1000; b++)
  {
    //Выполнять код
  }
  Form1->ProgressBar1->Progress++;
}


Да, но в цикле придется постоянно делать операцию сложения a + b, дабы получить законный индекс... поэтому первый вариант будет лучше...

8.8K
12 февраля 2008 года
Se AD WMD
165 / / 10.01.2007
Я тож сталкивался с такой траблой, основное торможение проги возникало из-за изменение position у progresbar'а и решил её таким путём:

 
Код:
Form2->ProgressBar2->Max=fl; //тут у меня максимальное значение, всегда разное
        Form2->ProgressBar2->Position=0;//ну этъ пнятно

        for(int y=0;y<fl;y+=100)
        {

            if(y%100==0) //тут необязательно 100, можно вычислять эту переменную перед циклом и подогнать к оптимальному значению
            Form2->ProgressBar2->Position+=100;

        }
3
12 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: frid-karatel
Я опечатался просто :) Не туда вставил прибавление прогресса...


Да нет, я хотел обратить внимание на a += b;.
Надо все же a = b;

Цитата: frid-karatel

Да, но в цикле придется постоянно делать операцию сложения a + b, дабы получить законный индекс... поэтому первый вариант будет лучше...


Тогда лучше так:

 
Код:
for (int a = 0; a < 10 000 000;)
{
  for (int b = a+1000; a < b; a++)
  {
    //Выполнять код
  }
  Form1->ProgressBar1->Progress++;
}
1.9K
14 февраля 2008 года
Anton Chik
175 / / 26.09.2005
Цитата: aks
Кто тебе такую чушь сказал - int как и любой тип в C++ не завязан на разрядность, количество байт и.т.п.

Но тем не менее в 32-х разрядных системах и компиляторах для них (да и в 64-х разрядных тоже) принято под int выделять 4 байта. Соответсвенно возможных вариантов значений там 2^32.
А то что ты написал - это для давно уже невыпускающихся 16-тибитных компов и древних уже неисспользуемых компиляторов для них.



блин, как время-то быстро бежит))) не успеваю поменять привычки
до сих пор вспоминаю с опаской переполнения интовских переменных)))
чесслово до сегодняшнего дня юзал в подобных случаях по надобности unsigned int, long int или float

240
14 февраля 2008 года
aks
2.5K / / 14.07.2006
Фигасе быстро. Это уже как минимум последние лет 15 повсеместно так. )
1
14 февраля 2008 года
kot_
7.3K / / 20.01.2000
Цитата: aks
Фигасе быстро. Это уже как минимум последние лет 15 повсеместно так. )


Чесно говоря - как так - я не очень понял. Переменная типа int имеет фиксированный размер. И при попытке записать туда значение больше допустимого вполне можно получить переполнение.

Цитата:

Кто тебе такую чушь сказал - int как и любой тип в C++ не завязан на разрядность, количество байт и.т.п.


и тут же далее:

Цитата:

Но тем не менее в 32-х разрядных системах и компиляторах для них (да и в 64-х разрядных тоже) принято под int выделять 4 байта.

255
14 февраля 2008 года
Dart Bobr
1.4K / / 09.04.2004
Просто все зависит от системы, и в зависимости от ее внутренней реализации int может иметь разнй размер. Но, под Windows x86/x64 принято под int выделять 4 байта.
240
15 февраля 2008 года
aks
2.5K / / 14.07.2006
kot_, я имел ввиду что в стандарте языка нигде не указанна привязка к размерности int. Только отношения между размерами типов.
Соответственно утверждать, что int только 2 байта (или только 4) и никак иначе - неверно. Все зависит от реализации. Сейчас принято int делать 4 байта. Хотя кто то до сих пор использует компиляторы с 2-х байтовым интом. Пройдет некоторое время возможно будет принято другая размерность. Так же как сменились 16-тиразрядные компиляторы на 32-х разрядные при переходе с того же доса в win32. И если не привязываться к разрядности жестко - это будет перенесенно гораздо легче. )
490
16 февраля 2008 года
frid-karatel
357 / / 15.09.2007
а как сделать возможность дебага созданного потока? дело в том, что если я запускаю функцию в потоке, а она выдает ошибку, то дебаггер мне показывает что-то вроде "Thread: ?????:?????"... И это отбило у меня желание использовать потоки.... какой есть выход? Что можно сделать?
490
16 февраля 2008 года
frid-karatel
357 / / 15.09.2007
а как быть, если у меня не круглое число, т.е. цикл до 93, а позиций у прогресса - 7?
490
19 февраля 2008 года
frid-karatel
357 / / 15.09.2007
в-общем, не знаю, как лучше всего реализовать цикл до не круглого числа, т.е. не до 1000, а до 999, когда полосок у прогресса (максимальных шагов) всего 10... как такое можно обработать? сравнивать каждый раз? или есть другой выход? Т.е. в итоге или не обрабатывается весь цикл, или идет переполенния, т.к. размер файла 999, а пытается взять 100-й char.
11
19 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: frid-karatel
в-общем, не знаю, как лучше всего реализовать цикл до не круглого числа, т.е. не до 1000, а до 999, когда полосок у прогресса (максимальных шагов) всего 10... как такое можно обработать? сравнивать каждый раз? или есть другой выход? Т.е. в итоге или не обрабатывается весь цикл, или идет переполенния, т.к. размер файла 999, а пытается взять 100-й char.



все понятия смешал и char зачем то приплел...

 
Код:
TProgressBar::Step = 1; чтобы плавно двигалась полоска
TProgressBar::Max = твое число, до которого у тебя цикл

цикл (от нуля до твое число
TProgressBar::Position = переменная цикла
цикл
490
19 февраля 2008 года
frid-karatel
357 / / 15.09.2007
нее... я не то имел ввиду :)

у меня есть цикл:
 
Код:
for (int a = 0; a < 10 000 000;)
{
  for (int b = a+1000; a < b; a++)
  {
    //Выполнять код
  }
  Form1->ProgressBar1->Progress++;
}


Как мне сделать определенное число подходов с проверкой... т.е. цикл примерно такой:
Код:
int Max = 10 000 000;
int Steps = 10;
int Step = Max / Steps;
for (int a = 0; a < Max; a++)
{
  for (int b = a+Step; a < b; a++)
  {
    //Выполнять код
  }
  Form1->ProgressBar1->Progress++;
}

Если Max будет не кратным Steps, напр, 11, то цикл пройдет неверно...

Как избавиться от этого?
92
19 февраля 2008 года
Тень Пса
2.2K / / 19.10.2006
сделать проверку, кратен ли Max твоему Steps....

если нет, добавить недостающее к Max

 
Код:
Max = 10 000 000;
Steps = 10;

if (Max % Steps > 0)
{
   Max += Steps - (Max % Steps);
}

Step = Max / Steps;


или это критично? :)
490
19 февраля 2008 года
frid-karatel
357 / / 15.09.2007
ну как сказать... если файл 999 байт, Max = 10, то получается, что оно добавит один байт (т.е. до 1000, чтобы было кратно), а потом постарается его считать.... и... ошибка
11
19 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: frid-karatel
ну как сказать... если файл 999 байт, Max = 10, то получается, что оно добавит один байт (т.е. до 1000, чтобы было кратно), а потом постарается его считать.... и... ошибка



повторюсь м.б.
привязывай не размер файла к Max прогрессбара, а наоборот прогрессбар к файлу

490
19 февраля 2008 года
frid-karatel
357 / / 15.09.2007
Цитата: oxotnik333
повторюсь м.б.
привязывай не размер файла к Max прогрессбара, а наоборот прогрессбар к файлу



да, но дело в том, что я использую не стандлартный прогресс бар, а картинку с делениями в виде >>>>>>>>, т.е. на ней 10 стрелочек.... и по мере продвижения я ее прокручиваю на одну стрелочку вправо... Как быть тут?

8.8K
21 февраля 2008 года
Se AD WMD
165 / / 10.01.2007
 
Код:
int max=999;
int steps=10;
int step=max/steps;
for(int x=0;x<max;x+=1)
{
//Что надо в цикле делаеш
if(x%step==0)
Progresbar->Position+=1;
}

Примерно тож самое что я писал в предыдущем посте.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог