powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
102 сообщений из 102, показаны все 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
Как в процессе исполнения ряда 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
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710410
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
function TfmCargoOutgoing.DoChangeOwnerContractCargoSub(AOldContractCargoSubId,
  ANewContractCargoSubId: integer): integer;
var
  CardCount: integer;
  q: TBISMySQLQuery;
  ChangedCount: integer; // кол-во измененных карточек
//  f: TForm;
//  i: integer;
//  pb: TProgressBar;
begin
  ChangedCount := 0;

  q := TBISMySQLQuery.Create;
  try
    // 1. Определить количество карточек для переноса
    q.From('cargo_card', 'cc');
    q.Select('COUNT(*) AS cnt');
    q.Where('object_type= ?', 'placement');
    q.AndWhere('get_weight_brutto_remains(cc.id) > 0', '');
    q.AndWhere('cc.contract_cargo_sub_id=?', AOldContractCargoSubId);
    q.Open;
    CardCount := q.Q.FieldByName('cnt').AsInteger;
    if Assigned(fP) then
      fP.Max3 := CardCount;

    // 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;

//      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 := 0;
//  pb.Max := CardCount;
//  pb.Step := 1;
//  f.Show();
//  for i := pb.Min to pb.Max do begin
////    pb.StepIt;
//    pb.Position := i;
//    sleep (100);
//  end;


    while not q.Q.Eof do
      begin
        if DoChangeOwnerCargoCard(q.Q.FieldByName('id').AsInteger, ANewContractCargoSubId) <> 0 then
          begin
            inc(ChangedCount);
//            pb.StepIt;

            if Assigned(fP) then
              fP.Position3 := ChangedCount;
//            ShowMessage(IntToStr(ChangedCount));
          end;
        q.Q.Next;
      end;

//    f.Free;
  finally
    q.Free;
    Result := ChangedCount;
  end;
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710411
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

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

не надо сразу сломя голову искать черную кошку...
В смысле? Я вижу, что код нестабилен. Вчера не работало, сегодня работает. Что будет завтра - неизвестно.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710413
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагаю, что зависание сервера (вернее связи с сервером) мешает работе VCL.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710414
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladПредполагаю, что зависание сервера (вернее связи с сервером) мешает работе VCL.
Это п....ц, дорогая редакция.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710416
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxвыбросить код slow-by-slow и написать sp-процедуру предлагали?
Что такое slow-by-slow и sp-процедура?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710417
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

это ты плохому от 79850 набрался. Сам он по себе человек хороший, но воспринимать сообщения технического плана от него не нужно, у него интересные взгляды на "внутреннюю реализацию", но они не вполне соответствуют официальным, а широта взглядов по отношению к у уже реализованным техническим системам чревата учащением случаев принятия не всегда верных решений...
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710778
MinGW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkinя писал статью , где ваш случай подробно описан
Простите, но у него как раз нет потоков. :) Он собрался их прикручивать, но они там как бы совсем не нужны.
schiГде-то я читал (не найду сейчас), что ProgressBar
Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39710838
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladКотовасияsvnvlad,

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

В смысле? Я вижу, что код нестабилен. Вчера не работало, сегодня работает. Что будет завтра - неизвестно. Прикручивание изолентой многопоточности стабильности не добавит. Сколько не встречал таких поделий, а результат такой, что случайно в одном из трех случаев приложение вылетает из системы... так что советую обновить резюме и отгулять накопившийся отпуск перед тем, как делать релиз многопоточность докручивал пару раз в Д7
но там, где действительно показалось нужным

1. для проверки, кто блокирует в Оракле
2. Для выполнения списка длительных Оракле-процедур с возможностью прерывания

Работает уже лет 10-12
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711048
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinGWkrapotkinя писал статью , где ваш случай подробно описан
Простите, но у него как раз нет потоков. :) Он собрался их прикручивать, но они там как бы совсем не нужны.
schiГде-то я читал (не найду сейчас), что ProgressBar
Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.
Сегодня опять не перерисовывается. Так что нужны они.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711049
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасияsvnvlad,

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

В смысле? Я вижу, что код нестабилен. Вчера не работало, сегодня работает. Что будет завтра - неизвестно. Прикручивание изолентой многопоточности стабильности не добавит. Сколько не встречал таких поделий, а результат такой, что случайно в одном из трех случаев приложение вылетает из системы... так что советую обновить резюме и отгулять накопившийся отпуск перед тем, как делать релиз
Вы просто не умеете их готовить.)
У меня в программе код автообновления программы написан на Thread-е. Очень четко и стабильно работает. ("Вы можете продолжать работать во время обновления").
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711054
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinGWОн собрался их прикручивать, но они там как бы совсем не нужны.
Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.
Есть другая программа, закидывает файлы на сервер обновлений. Там тоже прогрессбар морозится, это не единичный случай. Просто руки не доходят переписать на поток.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711055
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinтут вроде в правилах нет ограничений на ссылки
я писал статью , где ваш случай подробно описан
Спасибо, толково.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711068
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли в Thread-е обращаться на чтение полей из сложных подклассов?
Например, читать из диалогового окна параметры без синхронизации?
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
TChangeOwnerThread = class(TThread)
  private
    FfmDlg: TMyDialogWindow;
    ...
    procedure Execute; override;
  public
    constructor Create(AMode: TcoMode; const ACargoCardId: Integer; ATermProc: TNotifyEvent);
    destructor Destroy; override;
  end;

...
constructor TChangeOwnerThread.Create(AMode: TcoMode; const ACargoCardId: Integer; ATermProc: TNotifyEvent);
begin
  inherited Create(true);
  FreeOnTerminate := true;
  OnTerminate := ATermProc;

  FMode := AMode;
  Fcargo_card_id := ACargoCardId;

  FfmDlg := TfmMyDialog.Create(nil);
  if FfmDlg.ShowModal = mrOk then
    ...
end;

destructor TChangeOwnerThread.Destroy;
begin
  FfmDlg.Free;
  inherited;
end;

procedure TChangeOwnerThread.DoChangeCardOwner;
begin
  ...
  ADQuery1.ParamByName('old_card_id').AsInteger := FfmDlg.OldCardId;
  ADQuery1.ParamByName('new_card_id').AsInteger := FfmDlg.NewCardId;  
  ADQuery1.ExecSql;
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711072
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladМожно ли в Thread-е обращаться на чтение полей из сложных подклассов?
В чем проблема передать их в конструктор потока?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711302
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmansvnvladМожно ли в Thread-е обращаться на чтение полей из сложных подклассов?
В чем проблема передать их в конструктор потока?
Ну там несколько разных режимов. В зависимости от режима вызывается своя функция с разными параметрами.
Код: pascal
1.
2.
3.
4.
5.
// Процедуры смены собственника по уровням
    procedure DoChangeOwnerConsignment(AOldConsignmentId, ANewConsignmentId: integer);
    function DoChangeOwnerContractCargoConsignment(AOldContractCargoConsignmentId, ANewContractCargoConsignmentId: integer): integer;
    function DoChangeOwnerContractCargoSub(AOldContractCargoSubId, ANewContractCargoSubId: integer): integer;
    function DoChangeOwnerCargoCard(AOldCargoCardId, ANewContractCargoSubId: integer): integer; // возвращает id новой карточки


Какую функцию вызывать, определяется ответом в диалоговом окне. Причем каждая вышестоящая по тексту функция вызывает в цикле нижестоящую, та в свою очередь еще раз нижестоящую, и уже она вызывает DoChangeOwnerCargoCard (иерархия).
Я подумал, что все это сделать в потоке проще, чем извне потока определять или на каждую делать свой класс потока.
Может быть сделать 4 конструктора с разными параметрами?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711312
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad...
Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.
Сегодня опять не перерисовывается. Так что нужны они.[/quot]
Прямо вот этот вот код 21689633 перестал работать? Врешь поди.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711402
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladВ зависимости от режима вызывается своя функция с разными параметрами.
Одна функция с тремя параметрами: тип операции, две id.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39711507
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad...пошаговый прогресс не отображается...
svnvlad...Все заработало нормально. В коде НИЧЕГО не менял...
svnvlad...сегодня оказалось, что работает...
svnvlad...Сегодня опять не перерисовывается...
svnvlad...Вы просто не умеете их готовить.)
У меня в программе код автообновления программы написан на Thread-е. Очень четко и стабильно работает. ("Вы можете продолжать работать во время обновления").

Просто у меня нет волшебного календаря, в котором отмечено в какой день какие функции отваливаются.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712182
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасияsvnvlad...
Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.
Сегодня опять не перерисовывается. Так что нужны они.
Прямо вот этот вот код 21689633 перестал работать? Врешь поди.[/quot]
Сдался вам вот это код. Я же говорю, все зависит от скорости связи интернет-канала. Когда он быстрый, прогресс обновляется, когда медленный - морозится, и отображается полностью заполненным только в конце работы SQL-запросов.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712183
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbsvnvlad...пошаговый прогресс не отображается...
svnvlad...Все заработало нормально. В коде НИЧЕГО не менял...
svnvlad...сегодня оказалось, что работает...
svnvlad...Сегодня опять не перерисовывается...
svnvlad...Вы просто не умеете их готовить.)
У меня в программе код автообновления программы написан на Thread-е. Очень четко и стабильно работает. ("Вы можете продолжать работать во время обновления").

Просто у меня нет волшебного календаря, в котором отмечено в какой день какие функции отваливаются.
В те дни, когда связь тормозит, прогресс-бары замораживаются.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712185
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, актуальная тема: на основной форме имеется 7 DbGrid-ов, часть из которых связаны по типу Master-Detail. Через каждые 90 секунд форма обновляется, чтобы отобразить изменения, если они, возможно, сделаны другим сетевым пользователем. Во время процесса обновления сеток (перечитывания таблиц), отображаются песочные часики, и программа перестает реагировать на любые действия пользователя. И здесь как повезет. В локалке все это происходит достаточно быстро и незаметно. Удаленному же пользователю, который коннектится через интернет, работать не столь комфортно, иногда период заморозки составляет до 10 секунд при плохом соединении.
Так вот - можно ли как-то сделать сам процесс перечитывания данных из базы в Thread-е, а уже их отображение - в основном потоке? Думаю, это бы значительно улучшило дружественность программы к пользователям.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712186
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmansvnvladВ зависимости от режима вызывается своя функция с разными параметрами.
Одна функция с тремя параметрами: тип операции, две id.
Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712198
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladwadmanпропущено...

Одна функция с тремя параметрами: тип операции, две id.
Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.
Это ничего не меняет. Тип операции, старый ид, новый ид.
Уж по операции то сумеешь определить, что к чему?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712270
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmansvnvladпропущено...

Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.
Это ничего не меняет. Тип операции, старый ид, новый ид.
Уж по операции то сумеешь определить, что к чему?
Ну да, можно же присвоить в зависимости от типа.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712533
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladЧерез каждые 90 секунд форма обновляется, чтобы отобразить изменения, если они, возможно, сделаны другим сетевым пользователем ... период заморозки составляет до 10 секунд при плохом соединении.
Так вот - можно ли как-то сделать сам процесс перечитывания данных из базы в Thread-е, а уже их отображение - в основном потоке? Думаю, это бы значительно улучшило дружественность программы к пользователям.
Ну, капитан Очевидность задал бы вопрос: "Что будет, если 10 пользователей при плохом соединении будут постоянно перечитывать данные?"
Как-то процесс перечитывания можно сделать так:
Соединение с БД и все запросы должны создаваться и выполняться в самом Thread, можно всё что нужно для TTread вынести в отдельный TDataModule и при чтении создавать и разрушать его. Внутри TThread после загрузки всех наборов данных, копируем их содержимое (см. метод Synchronize) в какие-нибудь наборы данных в памяти (TMemDataSet, TClientDataset и т.п.), которые работают в основном потоке и показываются в гридах.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712539
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbКак-то процесс перечитывания можно сделать так:
Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712544
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanroschinspbКак-то процесс перечитывания можно сделать так:
Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712545
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbwadmanпропущено...

Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...
Сам догадался?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712546
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbНо чето подозреваю это слишком сложно...
Не совсем. Триггеры, доп.условие в where да обновление измененных записей в памяти.
Еще решить, что делать в конфликтных ситуациях.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712726
MinGW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvladСегодня опять не перерисовывается. Так что нужны они.
Нет. Значит проблема в каком-то другом месте.
Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39712903
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanroschinspbНо чето подозреваю это слишком сложно...
Не совсем Сложно в контексте Сегодня опять не перерисовывается
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713232
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinGWsvnvladСегодня опять не перерисовывается. Так что нужны они.
Нет. Значит проблема в каком-то другом месте.
Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.
Нет, всё равномерно выполняется. Сейчас сделал в треде, все нормально работает, только осталась в конце ближе к уничтожению треда какая-то ошибка доступа 5 вылазит. Но по данным все записывается четко.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713233
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanroschinspbКак-то процесс перечитывания можно сделать так:
Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
Там есть такая проверка. Просто само обновление сеток очень долго идет. Даже когда вручную нажимаешь кнопку обновить.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713488
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
FfmProgress.Free;

Код: 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.
  TChangeOwnerThread = class(TThread)
  private
    FMode: TcoMode;
    FParamType: TChangeOwnerParamType;
    Fcargo_card_id: integer;
    Fcontract_cargo_consignment_id: integer;
    Fcontract_cargo_sub_id: integer;
    Fconsignment_id: integer;
    Fret_cargo_card_id: integer;
    FfmProgress: TfmChangeOwnerProgress; // Окошко прогресс-баров
    Fnew_id: integer;
    Fret_message: string;
    ..............
    procedure InitBars;
    procedure UpdateBarPositions;
    .............
    property fmProgress: TfmChangeOwnerProgress read FfmProgress write FfmProgress;

    property Mode: TcoMode read FMode;
    property ParamType: TChangeOwnerParamType read FParamType;
    .............
    procedure Execute; override;
  public
    ..............
    constructor Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
    destructor Destroy; override;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
constructor TChangeOwnerThread.Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
var
  q: TBISMySQLQuery;
begin
  inherited Create(true);
  FreeOnTerminate := true;
  OnTerminate := ATermProc;

  FMode := AMode;
  FParamType := AParamType;
  Fcargo_card_id := ACargoCardId;
  Fnew_id := ANewId;
  ......

  FfmProgress := TfmChangeOwnerProgress.Create(nil);
  FfmProgress.Show;
end;



Код: pascal
1.
2.
3.
4.
5.
destructor TChangeOwnerThread.Destroy;
begin
  FfmProgress.Free;  // на этом месте возникает ошибка
  inherited;
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713510
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad
Код: pascal
1.
2.
    procedure InitBars;
    procedure UpdateBarPositions;


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

Код: 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.
31.
32.
33.
34.
35.
36.
37.
procedure TChangeOwnerThread.InitBars;
begin
  if Assigned(fmProgress) then
    begin
      if fmProgress.Max1 <> FMaxContractCargoConsignment then
        fmProgress.Max1 := FMaxContractCargoConsignment;
      if fmProgress.Max2 <> FMaxContractCargoSub then
        fmProgress.Max2 := FMaxContractCargoSub;
      if fmProgress.Max3 <> FMaxCargoCard then
        fmProgress.Max3 := FMaxCargoCard;
    end;
end;

procedure TChangeOwnerThread.UpdateBarPositions;
begin
  if Assigned(fmProgress) then
    begin
      if fmProgress.Position1 <> FChangedCountContractCargoConsignment then
        fmProgress.Position1 := FChangedCountContractCargoConsignment;
      if fmProgress.Position2 <> FChangedCountContractCargoSub then
        fmProgress.Position2 := FChangedCountContractCargoSub;
      if fmProgress.Position3 <> FChangedCountCargoCard then
        fmProgress.Position3 := FChangedCountCargoCard;
    end;
end;

procedure TChangeOwnerThread.SetChangedCountCargoCard(const Value: integer);
begin
  FChangedCountCargoCard := Value;
  Synchronize(UpdateBarPositions);
end;

procedure TChangeOwnerThread.SetMaxCargoCard(const Value: integer);
begin
  FMaxCargoCard := Value;
  Synchronize(InitBars);
end;



Да, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713569
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

а если в конструктор потока передавать уже созданную форму?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713571
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladДа, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.
Просто закрывай окно, а в событии OnClose выставь action := caFree.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713597
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45svnvlad,

а если в конструктор потока передавать уже созданную форму?
То же самое.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713605
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmansvnvladДа, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.
Просто закрывай окно, а в событии OnClose выставь action := caFree.
Теперь нормально. А почему так? Видимое окно нельзя освобождать?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713607
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladgoldmi45svnvlad,

а если в конструктор потока передавать уже созданную форму?
То же самое.
Ну и в деструкторе потока не убивать форму, а уничтожать в главном потоке в событии OnTerminate потока....
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713610
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladПодскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
FfmProgress.Free;
Ну давай думать. Эта строчка у тебя в деструкторе. Деструктор вызывается при уничтожении потока. Уничтожение потока при FreeOnTerminate = true происходит в самом потоке. Итого, операции с формой в левом потоке. Что говорится по этому поводу в VCL?
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713617
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladwadmanпропущено...

Просто закрывай окно, а в событии OnClose выставь action := caFree.
Теперь нормально. А почему так? Видимое окно нельзя освобождать?
Потому что поток еще "работает" с окном.

Поменяй эти две строки местами.
svnvlad
Код: pascal
1.
2.
3.
4.
5.
destructor TChangeOwnerThread.Destroy;
begin
  FfmProgress.Free;  // на этом месте возникает ошибка
  inherited;
end;
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713633
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerУничтожение потока при FreeOnTerminate = true происходит в самом потоке.
Этот момент упустил из виду. В общем, с caFree тогда единственный из простых вариант.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713721
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.
31.
32.
procedure TfmCargoOutgoing.ThreadChangeOwnerTerminate(Sender: TObject);
var
  th: TChangeOwnerThread absolute Sender;
begin
  if th.ret_cargo_card_id <> 0 then
    begin
      ChangeQueryCargo; // перечитывает сетку
      placement_cargo_card_id := th.ret_cargo_card_id; // позиционирует курсор сетки на нужную запись
      ShowMessage(th.ret_message);
    end;
end;

procedure TfmCargoOutgoing.actChangeOwnerExecute(Sender: TObject);
var
  fDlg: TfmChangeOwnerParams;
  ChThread: TChangeOwnerThread;
begin
  fDlg := TfmChangeOwnerParams.Create(self);
  try
    fDlg.source_cargo_card_id := placement_cargo_card_id;
    if fDlg.ShowModal = mrOk then
      begin
        ChThread := TChangeOwnerThread.Create(coChange, fDlg.ParamType, placement_cargo_card_id, fDlg.new_id, ThreadChangeOwnerTerminate);
        try
          ChThread.Start;
        finally
        end;
      end;
  finally
    fDlg.Free;
  end;
end;



Класс потока:
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
type
  TcoMode = (coChange, coCancel);

  TChangeOwnerThread = class(TThread)
  private
    FMode: TcoMode;
    FParamType: TChangeOwnerParamType;
    Fcargo_card_id: integer;
    Fcontract_cargo_consignment_id: integer;
    Fcontract_cargo_sub_id: integer;
    Fconsignment_id: integer;
    Fret_cargo_card_id: integer;
    FfmProgress: TfmChangeOwnerProgress;
    Fnew_id: integer;
    Fret_message: string;
    FChangedCountContractCargoConsignment: integer;
    FChangedCountContractCargoSub: integer;
    FChangedCountCargoCard: integer;
    FMaxContractCargoConsignment: integer;
    FMaxContractCargoSub: integer;
    FMaxCargoCard: integer;
    FTotalChangedCountCargoCard: integer;
    { Private declarations }

    procedure InitBars; // вызывать через Synchronize
    procedure UpdateBarPositions; // вызывать через Synchronize
    procedure SetCargoCardId(const Value: integer);
    procedure SetChangedCountCargoCard(const Value: integer);
    procedure SetChangedCountContractCargoConsignment(const Value: integer);
    procedure SetChangedCountContractCargoSub(const Value: integer);
    procedure SetMaxCargoCard(const Value: integer);
    procedure SetMaxContractCargoConsignment(const Value: integer);
    procedure SetMaxContractCargoSub(const Value: integer);
  protected
    property fmProgress: TfmChangeOwnerProgress read FfmProgress write FfmProgress; // форма с прогресс-барами

    property Mode: TcoMode read FMode;
    property ParamType: TChangeOwnerParamType read FParamType;
    property cargo_card_id: integer read Fcargo_card_id; // текущая карточка склада, задается конструктором
    property contract_cargo_sub_id: integer read Fcontract_cargo_sub_id; // подтип груза по договору в текущей карточке склада
    property contract_cargo_consignment_id: integer read Fcontract_cargo_consignment_id; // номенклатура партии
    property consignment_id: integer read Fconsignment_id; // партия

    property new_id: integer read Fnew_id; // новый id, на который нужно поменять (карточки, подтипа, номенклатуры или партии, в зависимости от ParamType)

    // Процедуры смены собственника по уровням
    ..............
    function DoChangeOwnerContractCargoSub(AOldContractCargoSubId, ANewContractCargoSubId: integer): integer;
    ....................

    procedure Execute; override;
  public
    property ret_cargo_card_id: integer read Fret_cargo_card_id; // для возвращения на ту же позицию сетки после всех операций
    property ret_message: string read Fret_message; // возвращаемое сообщение об успехе или ошибке
    property TotalChangedCountCargoCard: integer read FTotalChangedCountCargoCard write FTotalChangedCountCargoCard; // итоговое количество измененных карточек груза

    constructor Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
    destructor Destroy; override;
  end;


implementation

........

constructor TChangeOwnerThread.Create(AMode: TcoMode; AParamType: TChangeOwnerParamType;
                        const ACargoCardId: Integer; const ANewId: integer; ATermProc: TNotifyEvent);
begin
  inherited Create(true);
  FreeOnTerminate := true;
  OnTerminate := ATermProc;

  FMode := AMode;
  FParamType := AParamType;
  Fcargo_card_id := ACargoCardId;
  Fnew_id := ANewId;
  .................

  FfmProgress := TfmChangeOwnerProgress.Create(nil);
  FfmProgress.Show;
end;

destructor TChangeOwnerThread.Destroy;
begin
  fmProgress.Close;
  inherited;
end;

.....
procedure TChangeOwnerThread.Execute;
begin
  if Mode = coChange then // Смена собственника
    begin
      case ParamType of
      ptConsignment:
        begin
          DoChangeOwnerConsignment(consignment_id, new_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              Fret_message := 'Операция смены собственника для выбранной партии произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек передано новому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена смена собственника.';
        end;
      ptContractCargoConsignment:
        begin
          MaxContractCargoConsignment := 1;
          DoChangeOwnerContractCargoConsignment(contract_cargo_consignment_id, new_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1;
              Fret_message := 'Операция смены собственника для выбранной номенклатуры партии произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек передано новому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена смена собственника.';
        end;
      ptContractCargoSub:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1;
          DoChangeOwnerContractCargoSub(contract_cargo_sub_id, new_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1;
              Fret_message := 'Операция смены собственника для выбранного подтипа груза произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек передано новому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена смена собственника.';
        end;
      ptCargoCard:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1; MaxCargoCard := 1;
          Fret_cargo_card_id := DoChangeOwnerCargoCard(cargo_card_id, new_id);
          if Fret_cargo_card_id <> 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1; ChangedCountCargoCard := 1;
              Fret_message := 'Операция смены собственника для карточки склада произведена успешно!';
            end;
        end;
      end; //case
    end
  else // coCancel - Отмена смены собственника
    begin
      case ParamType of
      ptConsignment:
        begin
          DoCancelChangeOwnerConsignment(consignment_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              Fret_message := 'Отмена операции смены собственника для выбранной номенклатуры произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек возвращено старому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена отмена операции смены собственника.';
        end;
      ptContractCargoConsignment:
        begin
          MaxContractCargoConsignment := 1;
          DoCancelChangeOwnerContractCargoConsignment(contract_cargo_consignment_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1;
              Fret_message := 'Отмена операции смены собственника для выбранной номенклатуры произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек возвращено старому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена отмена операции смены собственника.';
        end;
      ptContractCargoSub:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1;
          DoCancelChangeOwnerContractCargoSub(contract_cargo_sub_id);
          if TotalChangedCountCargoCard > 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1;
              Fret_message := 'Отмена операции смены собственника для выбранного подтипа груза произведена успешно! ' +
                          IntToStr(TotalChangedCountCargoCard) + ' карточек возвращено старому владельцу.';
            end
          else
            Fret_message := 'Ни для одной карточки не произведена отмена операции смены собственника.';
        end;
      ptCargoCard:
        begin
          MaxContractCargoConsignment := 1; MaxContractCargoSub := 1; MaxCargoCard := 1;
          Fret_cargo_card_id := DoCancelChangeOwnerCargoCard(cargo_card_id);
          if Fret_cargo_card_id <> 0 then
            begin
              ChangedCountContractCargoConsignment := 1; ChangedCountContractCargoSub := 1; ChangedCountCargoCard := 1;
              Fret_message := 'Отмена операции смены собственника произведена успешно!';
            end
          else
            Fret_message := 'Для данной карточки не может быть отменена смена собственника, т.к. ее собственник не менялся!';
        end;
      end; // case
    end;
end;

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

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


Мой совет - убрать восклицательные знаки из сообщений.
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713830
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiМой совет - убрать восклицательные знаки из сообщений.
... и раскрасить в постельные тона
...
Рейтинг: 0 / 0
Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
    #39713875
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня в программе окно с прогрессом и выполнение работы с БД в отдельном треде выглядит вот так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
      dm.qry.DisableControls;
      try
        try
        TProgressView.Execute(MainForm,
          procedure ()
          begin
            dm.qry.Open; << вот тут в принципе можно втыкать всю работу с БД
          end);
        except
          on E: Exception do begin
            ShowMessage(E.Message);
          end;
        end;
      finally
        dm.qry.EnableControls;
      end;



Соответственно вся работа с БД идет в отдельном потоке, а в основном отображается окно с анимационной гифкой. Пользуясь случаем, Виктор, еще раз спасибо за помощь :)

Выглядит это так
...
Рейтинг: 0 / 0
102 сообщений из 102, показаны все 5 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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