Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431

Прогрессбар для цикла

29.06.2012, 00:50. Показов 5734. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как добавить для цикла прогресс бар? Цикл берёт два документа log and log2 смотрит есть ли изменения в log2 если есть выводит их.. Но если в файлах много строк то программа зависает на неопределённое количество времени.. Можно как нить прогресс баром показать процесс анализа?

Добавлено через 54 секунды
Ой цикл забыл
C++
1
2
3
4
5
6
7
8
9
10
   TStringList*s=new TStringList;
   TStringList*s2=new TStringList;
   s->LoadFromFile("log.ant") ;
   s2->LoadFromFile("log2.ant");
   for (int i=0;i<s2->Count;i++)
   {     for (int q=0;q<s->Count;q++){
      if (s2->Strings[i] == s->Strings[q]) break;
      else if (q == s->Count-1) Memo1->Lines->Add(s2->Strings[i]);
    }
   }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2012, 00:50
Ответы с готовыми решениями:

Самодельный прогрессбар
Написал очень простой прогрессбар, хотелось бы услышать мнение народа по этому поводу... #pragma resource &quot;*.dfm&quot; TForm1...

Прогрессбар на основе TImage
Мне понадобился супер-точный Прогрессбар. Решил написать его самостоятельно на основе TImage. Может кому-нибудь пригодится Unit1.h:...

Массив из миллиона элементов. Прогрессбар. Кнопка выхода из цикла. Application.ProcessMessages
Доброго времени суток. Нужна помощь. Дан одномерный целочисленный массив из миллиона элементов. Его нужно отсортировать. ...

35
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2012, 04:37
Студворк — интернет-сервис помощи студентам
Ну байты во втром файле нет смысла считать так как там непредсказуемо как пройдет сравнение...
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 04:43
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
так как там непредсказуемо как пройдет сравнение
на самом деле нам не важно как пройдет сравнение - важно, то что мы сравниваем строки, т.е. считываем инфу. И если второй файл во внимание не принимать, то ПрогрессБар не будет отражать действительность... Ну хотя если только по внешнему циклу (по первому файлу) пустить, то по идее норм будет... да?

Ну как норм... Не так подробно (кропотливо), скажем
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2012, 04:45
И так и так он действительность не будет показывать так как количество сравнений не известно зарание- поэтому я и говорю пренебречь им.
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 04:58
Avazart, блин точно... Затупил я что-то. Что же Вы раньше-то молчали!

Добавлено через 11 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Если у тебя файл, 8 ГБ то это приблизительно 4 размера int. Т.е int 1/4 полосы прогресса.
Приблизительно как-то так...
Чего-то я все равно не врубился в суть.
Предположим у нас файл действительно на 8 ГБ. Задаем ProgressBar1->Max = 8 ГБ / 4, чтобы уместить int.
Но теперь при считывании строки из файла полученное ее значение в байтах (размер строки) также надо делить на 4 для ProgressBar1->Position...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2012, 05:17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
string str;
ifstream  f;
char ch;
int bs=0;
int mbs=0;
 
f.open("D:\\Видео\\12.2007.BDRip.XviD.AC3.-NB.avi",ios::binary);
if(f)
 {
 while(f.get(ch))
   {
   if(ch=='\n'){ /*cout<<str<<endl;*/ str.clear();/* Сравнение строк*/ }
   else        { str+=ch; }
   bs++; if(bs==1e6) { bs=0; mbs++;cout<<mbs<<endl;}
   }
 cout<<mbs<<МБайт <<" и "<<bs<<" Байт"<<endl;
 }
 
system("pause");
return 0;
}
Добавлено через 10 минут
Если файл у тебя в не превышает к примеру 1 MБ то выводишь по bs если превышает то по mbs пренебрегая байтами и КБ. Можно конечно больше задать границ...
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 05:23
Avazart, дык а ProgressBar1->Position тут где будет?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2012, 05:26
Ну либо в цикле либо в условии в зависимости от размера файла как я сказал уже
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 05:29
Avazart, кстати, а вот
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
if(bs==1e6)
это типа 1024 или что вообще такое?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2012, 05:31
bs == 1*10^6 (>МегаБайт)
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 10:11
Vovik_0_1, в общем, если по уму, то надо использовать вариант от Avazart'а
Но мне лень, поэтому я предлагаю первоначальный с единственной поправкой на то, что шаг по ПрогрессБару должен соответствовать внешнему циклу, а не внутреннему (а максимальное число Бара = кол-во итераций внешнего цикла):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    TStringList*s = new TStringList;
    TStringList*s2 = new TStringList;
    s->LoadFromFile("log.ant");
    s2->LoadFromFile("log2.ant");
    ProgressBar1->Step = 1;
    ProgressBar1->Max = s2->Count;
    for (int i = 0; i < s2->Count; i++) {
        for (int q = 0; q < s->Count; q++) {
            if (s2->Strings[i] == s->Strings[q])
                break;
            else if (q == s->Count - 1)
                Memo1->Lines->Add(s2->Strings[i]);
        }
    this->ProgressBar1->StepIt();  
    }
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2012, 14:23
Если добустим каждый файл по 1,5 ГБ а оперативки на компе 2 ГБ, то что произойдет в этом случае при такой загрузке???
И не думаю что TStringList расчитан на такие размеры...
0
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
29.06.2012, 14:59  [ТС]
Проблема в том что на время анализа зависает программа как этого избежать? Знаю что нужно вроде создавать поток но если создавать как здесь Создание нового потока то перед всеми обьектами нужно ставить Form1-> но тогда не получается поставить this-> выдает ошибку. Как это исправить? А если без this-> то какаято муть получается. Можно ещё обьявить саму функцию но тогда ошибка
C++
1
[C++ Error] Unit1.cpp(69): E2034 Cannot convert 'unsigned long (__stdcall * (_closure )(void *))(void *)' to 'unsigned long (__stdcall *)(void *)'
и
C++
1
[C++ Error] Unit1.cpp(69): E2342 Type mismatch in parameter 'lpStartAddress' (wanted 'unsigned long (__stdcall *)(void *)', got 'void')
Обьявляю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TProgressBar *ProgressBar1;
        TProgressBar *ProgressBar2;
        TRichEdit *RichEdit1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        DWORD __stdcall ThreadFunc ( void *p );
};
Ну и саму
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DWORD __stdcall TForm1::ThreadFunc ( void *p )
{
    HDC hDC = GetDC ( Form1->Handle );
TStringList*s = new TStringList;
    TStringList*s2 = new TStringList;
    s->LoadFromFile("log.ant");
    s2->LoadFromFile("log2.ant");
    ProgressBar1->Step = 1;
    ProgressBar1->Max = s2->Count;
    for (int i = 0; i < s2->Count; i++) {
        for (int q = 0; q < s->Count; q++) {
            if (s2->Strings[i] == s->Strings[q])
                break;
            else if (q == s->Count - 1)
                Memo1->Lines->Add(s2->Strings[i]);
        }
    this->ProgressBar1->StepIt();  
    }
ReleaseDC ( Form1->Handle, hDC );
    MessageBeep( MB_OK );
    return 0;
}
Ну и вот кнопка
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 DWORD  ThreadID;
    //------------------------------------------------------------------------
    HANDLE hThread = CreateThread ( NULL, 0, ThreadFunc, NULL, 0, &ThreadID );
    //------------------------------------------------------------------------
    if ( hThread == 0 )
    ShowMessage ( "Проблема" );
}
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2012, 15:03
TThread класс - поток. Про этот поток уже в многих темах писал, да в Архангельском есть...

то перед всеми обьектами нужно ставить Form1-> но тогда не получается поставить this-> выдает ошибку.
Читайте про ООП в С++ и применения this
0
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
29.06.2012, 22:59  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Читайте про ООП в С++ и применения this
Прочитал.. Не понял зачем он был нужен. Но и без него вроде норм пашет!
А как можно его подключить для цикла из темы Список файлов в папке и её подпапках
Там же заранее Max не известен.
Конкретно для вот этой функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 void FindFiles(TStringList *sp, AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
  {
  if (!(sr.Name=="." || sr.Name==".."))
   if (((sr.Attr & faDirectory) == faDirectory ) ||
   (sr.Attr == faDirectory))
    {
    FindFiles(sp, DirName+"\\"+sr.Name);
    }
    else
    {
        sp->Add(DirName+"\\"+sr.Name);
    //убрать "DirName+"\\"+" для получения имен файлов без полных путей
    }
  }
 while (!FindNext(sr));
 FindClose(sr);
 }
0
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
01.07.2012, 23:33  [ТС]
Мысли есть?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.07.2012, 23:38
Мысль перестать быдлокодить и начать читать книжки...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2012, 23:38

Прогрессбар для фото
Есть слайдшоу, реализованное с помощью jquery.cycle2.js, как к нему сделать прогрессбар в форме кругляшков? &lt;div...

составить блок-схему алгоритмов для решения задач с использованием трех циклов цикла с постусловием, цикла с предусловием и цикла с параметрами
помогите составить блок-схему алгоритмов для решения задач с использованием трех циклов цикла с постусловием, цикла с предусловием и цикла...

Применение цикла if для определения простых чисел. If внутри цикла for
Доброго времени суток, подскажите пожалуйста, в чем тут дело. С кодом все хорошо, все работает, просто я пытаюсь докопаться до сути и...

Для цикла с предусловием запишите его полный эквивалент с помощью цикла с постусловием
pr:=1; for i:=2 to n do if odd(i) then pr:=pr-(1/i) else pr:=pr+(1/i);

Как из цикла вывести данные для другого цикла?
Вообщем такая фигня... Как из цикла вывести данные для другого цикла? а то он не видит Пример : int x1 , x2 , d; if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru