ProgressBar от 0 до 10 000 000 - "Тормознуто"
Вычисляется цикл от 1 до 10 000 000. Как сделать более разумным движение статуса на ProgressBar'e?
Делаю я сейчас примерно так:
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 не очень красиво "дергается", хочется плавности...
Что посоветуете мне в решении этого вопроса?
по-моему ничо не поделаешь, можно лишь упростить условие до
for (i = 0; i < 1e7; i++)
{
if (i > step)
{
step+=1e5;
Form1->ProgressBar1->Position++;
}
}
Кто тебе такую чушь сказал - int как и любой тип в C++ не завязан на разрядность, количество байт и.т.п.
Но тем не менее в 32-х разрядных системах и компиляторах для них (да и в 64-х разрядных тоже) принято под int выделять 4 байта. Соответсвенно возможных вариантов значений там 2^32.
А то что ты написал - это для давно уже невыпускающихся 16-тибитных компов и древних уже неисспользуемых компиляторов для них.
Вычисляется цикл от 1 до 10 000 000. Как сделать более разумным движение статуса на ProgressBar'e?
Делаю я сейчас примерно так:
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->Position++;
цикл
и поместить это в отдельный процесс
цикл
Form1->ProgressBar1->Position++;
цикл
и поместить это в отдельный процесс
Да, но в чем разница - выполнять в отдельном процессе или нет? функция-то все равно будет обрабатывать цикл, причем, как мне кажется, этот вариант даже медленней, ведь мы фактически обращаемся к компоненту на форме, т.е. сначала инициализируем форму, потом компонент, а потом уже свойство... это уменьшает скорость...
У меня есть вариант:
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 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 b;
for (a = 0; a < 10 000 000;)
{
for (b = a; b < a + 1000; b++)
{
//Выполнять код
}
a = b;
Form1->ProgressBar1->Progress++;
}
или тогда уж
{
for (int b = 0; b < 1000; b++)
{
//Выполнять код
}
Form1->ProgressBar1->Progress++;
}
У меня есть вариант:
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 b;
for (a = 0; a < 10 000 000;)
{
for (b = a; b < a + 1000; b++)
{
//Выполнять код
}
a = b;
Form1->ProgressBar1->Progress++;
}
Я опечатался просто :) Не туда вставил прибавление прогресса...
или тогда уж
{
for (int b = 0; b < 1000; b++)
{
//Выполнять код
}
Form1->ProgressBar1->Progress++;
}
Да, но в цикле придется постоянно делать операцию сложения a + b, дабы получить законный индекс... поэтому первый вариант будет лучше...
Form2->ProgressBar2->Position=0;//ну этъ пнятно
for(int y=0;y<fl;y+=100)
{
if(y%100==0) //тут необязательно 100, можно вычислять эту переменную перед циклом и подогнать к оптимальному значению
Form2->ProgressBar2->Position+=100;
}
Да нет, я хотел обратить внимание на a += b;.
Надо все же a = b;
Да, но в цикле придется постоянно делать операцию сложения a + b, дабы получить законный индекс... поэтому первый вариант будет лучше...
Тогда лучше так:
{
for (int b = a+1000; a < b; a++)
{
//Выполнять код
}
Form1->ProgressBar1->Progress++;
}
Но тем не менее в 32-х разрядных системах и компиляторах для них (да и в 64-х разрядных тоже) принято под int выделять 4 байта. Соответсвенно возможных вариантов значений там 2^32.
А то что ты написал - это для давно уже невыпускающихся 16-тибитных компов и древних уже неисспользуемых компиляторов для них.
блин, как время-то быстро бежит))) не успеваю поменять привычки
до сих пор вспоминаю с опаской переполнения интовских переменных)))
чесслово до сегодняшнего дня юзал в подобных случаях по надобности unsigned int, long int или float
Чесно говоря - как так - я не очень понял. Переменная типа int имеет фиксированный размер. И при попытке записать туда значение больше допустимого вполне можно получить переполнение.
Кто тебе такую чушь сказал - int как и любой тип в C++ не завязан на разрядность, количество байт и.т.п.
и тут же далее:
Но тем не менее в 32-х разрядных системах и компиляторах для них (да и в 64-х разрядных тоже) принято под int выделять 4 байта.
Соответственно утверждать, что int только 2 байта (или только 4) и никак иначе - неверно. Все зависит от реализации. Сейчас принято int делать 4 байта. Хотя кто то до сих пор использует компиляторы с 2-х байтовым интом. Пройдет некоторое время возможно будет принято другая размерность. Так же как сменились 16-тиразрядные компиляторы на 32-х разрядные при переходе с того же доса в win32. И если не привязываться к разрядности жестко - это будет перенесенно гораздо легче. )
все понятия смешал и char зачем то приплел...
TProgressBar::Max = твое число, до которого у тебя цикл
цикл (от нуля до твое число
TProgressBar::Position = переменная цикла
цикл
у меня есть цикл:
{
for (int b = a+1000; a < b; a++)
{
//Выполнять код
}
Form1->ProgressBar1->Progress++;
}
Как мне сделать определенное число подходов с проверкой... т.е. цикл примерно такой:
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, то цикл пройдет неверно...
Как избавиться от этого?
если нет, добавить недостающее к Max
Steps = 10;
if (Max % Steps > 0)
{
Max += Steps - (Max % Steps);
}
Step = Max / Steps;
или это критично? :)
повторюсь м.б.
привязывай не размер файла к Max прогрессбара, а наоборот прогрессбар к файлу
привязывай не размер файла к Max прогрессбара, а наоборот прогрессбар к файлу
да, но дело в том, что я использую не стандлартный прогресс бар, а картинку с делениями в виде >>>>>>>>, т.е. на ней 10 стрелочек.... и по мере продвижения я ее прокручиваю на одну стрелочку вправо... Как быть тут?
int steps=10;
int step=max/steps;
for(int x=0;x<max;x+=1)
{
//Что надо в цикле делаеш
if(x%step==0)
Progresbar->Position+=1;
}
Примерно тож самое что я писал в предыдущем посте.