powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
25 сообщений из 102, страница 1 из 5
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709458
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедура выполняет цикл обращения к базе, и в каждой итерации пытается обновлять прогресс-бар. Но он не движется. Лишь после окончания всего цикла бар обновляется и оказывается заполненным на 100%.
Код: pascal
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.
28.
29.
30.
function TfmCargoOutgoing.DoChangeOwnerContractCargoSub(AOldContractCargoSubId,
  ANewContractCargoSubId: integer): integer;
var
  CardCount: integer;
  ChangedCount: integer; // кол-во измененных карточек
begin
  ChangedCount := 0;

...
    // 1. Определить количество карточек для переноса
    ...
    if Assigned(fP) then
      fP.Max3 := CardCount; // инициализация общего количества для прогресс-бара
    ....
    // 2. Перенести все карточки в новый подтип груза по договору    
    while not q.Q.Eof do
      begin
        if DoChangeOwnerCargoCard(q.Q.FieldByName('id').AsInteger, ANewContractCargoSubId) <> 0 then
          begin
            inc(ChangedCount);

            if Assigned(fP) then
              fP.Position3 := ChangedCount; // обновление позиции прогресс-бара

          end;
        q.Q.Next;
      end;

    Result := ChangedCount;
end;


Вот например процедура обновления Position бара:
Код: pascal
1.
2.
3.
4.
5.
procedure TfmChangeOwnerProgress.SetPosition3(const Value: integer);
begin
  ProgressBarCargoCard.Position := Value;
  Application.ProcessMessages;
end;


Результат на скриншотах (вначале бары полностью пустые, потом полностью заполнены, пошаговый прогресс не отображается).
Напрашивается решения - засунуть в поток. Но что именно? Само окно с прогресс-барами или всю верхнюю процедуру?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709459
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот в конце что отображается:
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709477
QT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT
Гость
Я не вижу где вы вызываете этот SetPosition3().

Вызов ProcessMessages() всей Application может быть излишним, попробуйте обойтись вызовом Repaint() окне содержащей ProgressBar (хотя по идее оно и само должно вызывать).

Не совсем понятно - используются ли потоки сейчас?

Версия Делфи?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709480
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladНапрашивается решения - засунуть в поток. Но что именно? Само окно с прогресс-барами или
всю верхнюю процедуру?

Ответ очевиден: всю верхнюю процедуру. Поскольку окнами должен владеть только один поток.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709492
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Код: pascal
1.
2.
ProgressBarCargoCard.Position := Value;
  Application.ProcessMessages;


Надо так:
Код: pascal
1.
2.
ProgressBarCargoCard.Position := Value;
  ProgressBarCargoCard.Update;


Выкрутка сообщений и не должна принудительно перерисовывать окна. Это делает функция UpdateWindow - send'ом присылает WM_PAINT с накопившимся инвалидированным прямоугольником.

Если это не поможет - значит ошибка в логике кода (я его не смотрел).

А вообще, естественно, надо переносить тяжелую работу в доп. поток.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709538
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
логика работы с прогрессами должна быть такой
в главном потоке просто отображается форма и прогресс-бар
в доп потоках проходит работа по обмену данными и время от времени в синхронизации дергается установка значений прогресса

когда поток заканчивается, он приходит в обработчик OnTerminate и закрывает окно
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709578
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
QTЯ не вижу где вы вызываете этот SetPosition3().

Вызов ProcessMessages() всей Application может быть излишним, попробуйте обойтись вызовом Repaint() окне содержащей ProgressBar (хотя по идее оно и само должно вызывать).

Не совсем понятно - используются ли потоки сейчас?

Версия Делфи?


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TfmChangeOwnerProgress = class(TForm)
  ....
  public
    { Public declarations }
    property Position1: integer read GetPosition1 write SetPosition1;
    property Position2: integer read GetPosition2 write SetPosition2;
    property Position3: integer read GetPosition3 write SetPosition3;
    property Max1: integer read GetMax1 write SetMax1;
    property Max2: integer read GetMax2 write SetMax2;
    property Max3: integer read GetMax3 write SetMax3;
  end;
...


Сейчас потоки не используются.
Delphi 2010.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709583
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRocksvnvlad
Код: pascal
1.
2.
ProgressBarCargoCard.Position := Value;
  Application.ProcessMessages;


Надо так:
Код: pascal
1.
2.
ProgressBarCargoCard.Position := Value;
  ProgressBarCargoCard.Update;



Не помогает.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709608
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinлогика работы с прогрессами должна быть такой
в главном потоке просто отображается форма и прогресс-бар
в доп потоках проходит работа по обмену данными и время от времени в синхронизации дергается установка значений прогресса

когда поток заканчивается, он приходит в обработчик OnTerminate и закрывает окно
Можно ли окно создать внутри конструктора потока, до запуска Start?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
constructor TChangeOwnerThread.Create(const ACargoCardId: Integer);
begin
  Fcargo_card_id := ACargoCardId;

  FfmProgress := TfmChangeOwnerProgress.Create(nil);
  FfmProgress.ShowModal;

  OnTerminate := TerminateHandler;
  inherited Create(true);
  FreeOnTerminate := false;
end;

procedure TChangeOwnerThread.TerminateHandler(Sender: TObject);
begin
  FreeAndNil(FfmProgress);
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709639
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

ты, вроде, уже тут наспрашивал на 4 страницы. Мало?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709642
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladМожно ли окно создать внутри конструктора потока, до запуска Start?
Можно, но без VCL. Тогда поток будет честно обрабатывать в себе сообщения извне для этого окна.
Но это не для тебя, т.к. твой поток будет все время занят.

В общем, придется программировать. Окно создавать вне потока, а поток будет сообщать о своем прогрессе, как и положено.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709674
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladYuRockпропущено...

Надо так:
Код: pascal
1.
2.
ProgressBarCargoCard.Position := Value;
  ProgressBarCargoCard.Update;




Не помогает.Перед Update еще Invalidate надо, я забыл, или сразу Repaint - он и то и то вызовет.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709677
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmansvnvladМожно ли окно создать внутри конструктора потока, до запуска Start?
Можно, но без VCL. Тогда поток будет честно обрабатывать в себе сообщения извне для этого окна.
Но это не для тебя, т.к. твой поток будет все время занят.

В общем, придется программировать. Окно создавать вне потока, а поток будет сообщать о своем прогрессе, как и положено.Ну почему, конструктор же - это еще главный поток. Можно, конечно. А вот в execute уже будет долгая операция.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709678
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНу почему, конструктор же - это еще главный поток.
Какой тогда смысл в этом окошке? Я просто смотрю в ХШ. :)
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709679
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRocksvnvladпропущено...

Не помогает.Перед Update еще Invalidate надо, я забыл, или сразу Repaint - он и то и то вызовет.

Нафига ? SetPosition у ProgressBar и так объявляет недействительным нужные части окна.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709695
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае поток это оверхед. Код нормальный, почему не работает как надо - непонятно.
Пример ведет себя как надо
Код: pascal
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.
type
  TForm2 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  while ProgressBar1.Position < ProgressBar1.Max do
  begin
    ProgressBar1.StepIt;
    sleep(100);
  end;
end;



Попробуй логировать ChangedCount при вызовах
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709697
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме. Если надо именно окошко в отдельном thread их есть у меня.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709861
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докsvnvlad,

ты, вроде, уже тут наспрашивал на 4 страницы. Мало?
Вы что-то путаете. Я на тот форум не заходил.)
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709864
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanYuRockНу почему, конструктор же - это еще главный поток.
Какой тогда смысл в этом окошке? Я просто смотрю в ХШ. :)
Эээ... отображать прогресс цикла выполнения SQL-запросов.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709866
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2В данном случае поток это оверхед. Код нормальный, почему не работает как надо - непонятно.
Пример ведет себя как надо
Код: pascal
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.
type
  TForm2 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  while ProgressBar1.Position < ProgressBar1.Max do
  begin
    ProgressBar1.StepIt;
    sleep(100);
  end;
end;



Попробуй логировать ChangedCount при вызовах
Все правильно. При sleep или точках останова все обновляется. Но попробуйте вызвать обновление изнутри цикла выполнения SQL-запросов - все время потока занимают SQL-запросы, VCL не успевает обновляться. То ли сообщения не доходят, то ли не считает нужным немедленно на них реагировать.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709870
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и добавь invalidate и sleep, раз в N-дцать записей
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709894
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladТо ли сообщения не доходят, то ли не считает нужным немедленно на них реагировать.
Создал модальное окно, запустил поток.
Поток шлет свой счетчик этому окну.
Поток закончился, окно закрылось.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709904
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было, делал...

Модальное окно, которое по таймеру читало из БД значение прогресса.
т.к. Процедура была на той стороне, да ещё и в много потоков запускалась
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709908
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubНу и добавь invalidate и sleep, раз в N-дцать записей
Нет, все бесполезно, и sleep, и Repaint, и Application.ProcessMessages делал, не помогает. Лучше напишу поток.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709947
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в чём то ином, ProcessMessages для прогрессбара вполне достаточно, хотя и кривовато
...
Рейтинг: 0 / 0
25 сообщений из 102, страница 1 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]