powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
25 сообщений из 102, страница 2 из 5
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709949
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот таким образом правильно будет по завершении работы потока получить из него результат выполнения (id первой обновленной записи)?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ChThread := TChangeOwnerThread.Create(coChange, placement_cargo_card_id);
  try
    ChThread.Start;
  finally
    if ChThread.ret_cargo_card_id <> 0 then
      begin
        ChangeQueryCargo; // обновляет основную сетку
        placement_cargo_card_id := ChThread.ret_cargo_card_id; // позиционирует курсор на запись в сетке
      end;
    ChThread.Free;
  end;


Или такой код приведет к открытию потока и немедленному его уничтожению?
Если что, код самого Create примерно такой:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
constructor TChangeOwnerThread.Create(AMode: TcoMode; const ACargoCardId: Integer);
begin
  FMode := AMode;
  Fcargo_card_id := ACargoCardId;

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

  OnTerminate := TerminateHandler;
  inherited Create(true);
  FreeOnTerminate := false;
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709955
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем нужно после отрабатывания всех SQL-запросов, которые засунуты в поток (после завершения работы потока), обновить основную сетку с данными и позиционировать курсор (Locate) на ту запись, id которой будет храниться внутри потока. Как это грамотно сделать?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39709958
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladКак это грамотно сделать?
Посмотри туда https://github.com/wadman/wthread
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710016
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladzinpubНу и добавь invalidate и sleep, раз в N-дцать записей
Нет, все бесполезно, и sleep, и Repaint, и Application.ProcessMessages делал, не помогает. Лучше напишу поток.
Куда тебе еще поток, ты прогрессбаром разобраться не можешь...
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710020
QT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT
Гость
Изначально вопрос был про ProgressBar.
И вот этот пример кода показывает, что ProgressBar нормально отображается и без потоков и без каких-либо ProcessMessages() / Repaint() / Update() / Invalidate().
Надо смотреть подробнее. Сделайте вывод в логи.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710152
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiYuRockпропущено...
Перед Update еще Invalidate надо, я забыл, или сразу Repaint - он и то и то вызовет.

Нафига ? SetPosition у ProgressBar и так объявляет недействительным нужные части окна.Если так (что логично и скорей всего, просто нет щас уозможности исходники посмотреть) - тогда не надо. Значит, ошибка в логике, и тогда ничего не поможет, кроме исправления её.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710154
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladТо ли сообщения не доходят, то ли не считает нужным немедленно на них реагировать.Нет, всё всегда работает в соответствие с жокументацией по винапи. За исключением редких багов, которые в основном давно вылизаны и пофикшены.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710156
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubНу и добавь invalidate и sleep, раз в N-дцать записейслип бесполезен, а инвалидэйта мало - нужен апдейт. Так говорит документация, а жизнь показывает, что она не врет в данном случае.
Так что тыкать пальцем в небо - просто потеря времени.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710157
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubПроблема в чём то ином, ProcessMessages для прогрессбара вполне достаточно, хотя и кривоватоНе достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710158
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockzinpubПроблема в чём то ином, ProcessMessages для прогрессбара вполне достаточно, хотя и кривоватоНе достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.Даже точнее так: после ProcessMessages винда пошлет WM_PAINT через PostMessage (добавит в очередь), но обработка этого сообщения не начнется сразу, т.к. пойдет выполнение дальнейшего кода программы, в итоге - окно с прогрессбаром не перерисуется (когда надо).
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710162
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockYuRockпропущено...
Не достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.Даже точнее так: после ProcessMessages винда пошлет WM_PAINT через PostMessage (добавит в очередь), но обработка этого сообщения не начнется сразу, т.к. пойдет выполнение дальнейшего кода программы, в итоге - окно с прогрессбаром не перерисуется (когда надо).
Все правильно.

КотовасияКуда тебе еще поток, ты прогрессбаром разобраться не можешь...
Сами попробуйте обновлять прогрессбар в цикле MySQL. Сто раз уже такое встречал, что замораживается до конца цикла, просто руки не доходили основательно решить вопрос.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710163
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 при вызовах

Вот вывод с "логированием" - логирование осуществляется вызовом функции ShowMessage. Как и ожидалось, все отображается. И не нужны даже Update с ProcessMessages.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// 2. Перенести все карточки в новый подтип груза по договору
    q.From('cargo_card', 'cc');
    q.Select('cc.id');
    q.Where('object_type= ?', 'placement');
    q.AndWhere('get_weight_brutto_remains(cc.id) > 0', '');
    q.AndWhere('cc.contract_cargo_sub_id=?', AOldContractCargoSubId);
    q.Open;
    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;
            ShowMessage(IntToStr(ChangedCount));
          end;
        q.Q.Next;
      end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710165
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вторая
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710166
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Третья
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710167
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710168
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И это немудрено, во время висения диалоговых ShowMesage-й у программы достаточно времени, чтобы обработать все сообщения.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710169
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad...
КотовасияКуда тебе еще поток, ты прогрессбаром разобраться не можешь...
Сами попробуйте обновлять прогрессбар в цикле MySQL. Сто раз уже такое встречал, что замораживается до конца цикла, просто руки не доходили основательно решить вопрос.

Вот тебе код, повесь его "на кнопку", попробуй - заработает ли.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
  f: TForm;
  i: Integer;
  pb: TProgressBar;
begin
  f := TForm.Create(nil);
  f.SetBounds(0, 0, 300, 70);
  f.Position := poScreenCenter;
  pb := TProgressBar.Create(f);
  pb.Align := alClient;
  pb.Parent := f;
  pb.Min := 1;
  pb.Max := 100;
  pb.Step := 1;
  f.Show();
  for i := pb.Min to pb.Max do begin
    pb.StepIt;
    sleep (100);
  end;
  f.Free;
end;


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

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

Вот тебе код, повесь его "на кнопку", попробуй - заработает ли.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
  f: TForm;
  i: Integer;
  pb: TProgressBar;
begin
  f := TForm.Create(nil);
  f.SetBounds(0, 0, 300, 70);
  f.Position := poScreenCenter;
  pb := TProgressBar.Create(f);
  pb.Align := alClient;
  pb.Parent := f;
  pb.Min := 1;
  pb.Max := 100;
  pb.Step := 1;
  f.Show();
  for i := pb.Min to pb.Max do begin
    pb.StepIt;
    sleep (100);
  end;
  f.Free;
end;



Если заработает - замени sleep(100) на свою работу с mySQLВряд ли заработает. Тут та же проблема, что и у ТС, идентичная.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710239
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Код: 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;

выбросить код slow-by-slow и написать sp-процедуру предлагали?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710246
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockYuRockпропущено...
Не достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.Даже точнее так: после ProcessMessages винда пошлет WM_PAINT через PostMessage (добавит в очередь), но обработка этого сообщения не начнется сразу, т.к. пойдет выполнение дальнейшего кода программы, в итоге - окно с прогрессбаром не перерисуется (когда надо).

https://docs.microsoft.com/en-us/windows/desktop/controls/create-progress-bar-controls

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


Вот тебе код, повесь его "на кнопку", попробуй - заработает ли.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
  f: TForm;
  i: Integer;
  pb: TProgressBar;
begin
  f := TForm.Create(nil);
  f.SetBounds(0, 0, 300, 70);
  f.Position := poScreenCenter;
  pb := TProgressBar.Create(f);
  pb.Align := alClient;
  pb.Parent := f;
  pb.Min := 1;
  pb.Max := 100;
  pb.Step := 1;
  f.Show();
  for i := pb.Min to pb.Max do begin
    pb.StepIt;
    sleep (100);
  end;
  f.Free;
end;




Если заработает - замени sleep(100) на свою работу с mySQLВряд ли заработает. Тут та же проблема, что и у ТС, идентичная.
Это рабочий код.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710406
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияYuRockпропущено...
Вряд ли заработает. Тут та же проблема, что и у ТС, идентичная.
Это рабочий код.
Шаман однако.
На кнопке код работал. Попробовал встроить в SQL-цикл. Тоже показал прогресс. Затем закомментировал этот код и оставил свой код как было, убрал даже ProcessMessages и Repaint где они были. Все заработало нормально. В коде НИЧЕГО не менял. Но вчера он не работал, а сегодня работает. Одно замечание - вчера работало все медленно, сегодня быстро, т.е. связь с сервером лучше. Вчера обработка 3 запросов занимала где-то 3 секунды, сегодня доли секунды. Может быть с этим связано?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710407
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже так - прежде, чем начал тестировать этот код, заметил, что мое окно с прогресс барами работает нормально.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710409
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вчера день потратил на написание класса Thread-а, а сегодня оказалось, что работает без него. Дельфи издевается?
...
Рейтинг: 0 / 0
25 сообщений из 102, страница 2 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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