Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
 Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1961
Процедура выполняет цикл обращения к базе, и в каждой итерации пытается обновлять прогресс-бар. Но он не движется. Лишь после окончания всего цикла бар обновляется и оказывается заполненным на 100%.
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 бара:
procedure TfmChangeOwnerProgress.SetPosition3(const Value: integer);
begin
  ProgressBarCargoCard.Position := Value;
  Application.ProcessMessages;
end;

Результат на скриншотах (вначале бары полностью пустые, потом полностью заполнены, пошаговый прогресс не отображается).
Напрашивается решения - засунуть в поток. Но что именно? Само окно с прогресс-барами или всю верхнюю процедуру?

К сообщению приложен файл. Размер - 6Kb
27 сен 18, 18:16    [21688437]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
svnvlad
Member

Откуда:
Сообщений: 1961
вот в конце что отображается:

К сообщению приложен файл. Размер - 5Kb
27 сен 18, 18:16    [21688439]     Ответить | Цитировать Сообщить модератору
 Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
QT
Guest
  • Я не вижу где вы вызываете этот SetPosition3().
  • Вызов ProcessMessages() всей Application может быть излишним, попробуйте обойтись вызовом Repaint() окне содержащей ProgressBar (хотя по идее оно и само должно вызывать).
  • Не совсем понятно - используются ли потоки сейчас?
  • Версия Делфи?
  • 27 сен 18, 18:40    [21688463]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Dimitry Sibiryakov
    Member

    Откуда:
    Сообщений: 46376

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

    Ответ очевиден: всю верхнюю процедуру. Поскольку окнами должен владеть только один поток.

    Posted via ActualForum NNTP Server 1.5

    27 сен 18, 18:43    [21688467]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    svnvlad
    ProgressBarCargoCard.Position := Value;
      Application.ProcessMessages;
    

    Надо так:
    ProgressBarCargoCard.Position := Value;
      ProgressBarCargoCard.Update;
    

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

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

    А вообще, естественно, надо переносить тяжелую работу в доп. поток.
    27 сен 18, 19:13    [21688487]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    krapotkin
    Member

    Откуда: Екатеринбург
    Сообщений: 637
    логика работы с прогрессами должна быть такой
    в главном потоке просто отображается форма и прогресс-бар
    в доп потоках проходит работа по обмену данными и время от времени в синхронизации дергается установка значений прогресса

    когда поток заканчивается, он приходит в обработчик OnTerminate и закрывает окно
    27 сен 18, 21:30    [21688549]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    QT
  • Я не вижу где вы вызываете этот SetPosition3().
  • Вызов ProcessMessages() всей Application может быть излишним, попробуйте обойтись вызовом Repaint() окне содержащей ProgressBar (хотя по идее оно и само должно вызывать).
  • Не совсем понятно - используются ли потоки сейчас?
  • Версия Делфи?


  • 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.
    27 сен 18, 23:45    [21688612]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    YuRock
    svnvlad
    ProgressBarCargoCard.Position := Value;
      Application.ProcessMessages;
    

    Надо так:
    ProgressBarCargoCard.Position := Value;
      ProgressBarCargoCard.Update;
    


    Не помогает.
    27 сен 18, 23:50    [21688618]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    krapotkin
    логика работы с прогрессами должна быть такой
    в главном потоке просто отображается форма и прогресс-бар
    в доп потоках проходит работа по обмену данными и время от времени в синхронизации дергается установка значений прогресса

    когда поток заканчивается, он приходит в обработчик OnTerminate и закрывает окно

    Можно ли окно создать внутри конструктора потока, до запуска Start?
    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;
    
    28 сен 18, 06:04    [21688659]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Док
    Member

    Откуда: Казань
    Сообщений: 5874
    svnvlad,

    ты, вроде, уже тут наспрашивал на 4 страницы. Мало?
    28 сен 18, 08:39    [21688708]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    Можно ли окно создать внутри конструктора потока, до запуска Start?

    Можно, но без VCL. Тогда поток будет честно обрабатывать в себе сообщения извне для этого окна.
    Но это не для тебя, т.к. твой поток будет все время занят.

    В общем, придется программировать. Окно создавать вне потока, а поток будет сообщать о своем прогрессе, как и положено.
    28 сен 18, 08:41    [21688711]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    svnvlad
    YuRock
    пропущено...

    Надо так:
    ProgressBarCargoCard.Position := Value;
      ProgressBarCargoCard.Update;
    



    Не помогает.
    Перед Update еще Invalidate надо, я забыл, или сразу Repaint - он и то и то вызовет.
    28 сен 18, 09:58    [21688778]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    wadman
    svnvlad
    Можно ли окно создать внутри конструктора потока, до запуска Start?

    Можно, но без VCL. Тогда поток будет честно обрабатывать в себе сообщения извне для этого окна.
    Но это не для тебя, т.к. твой поток будет все время занят.

    В общем, придется программировать. Окно создавать вне потока, а поток будет сообщать о своем прогрессе, как и положено.
    Ну почему, конструктор же - это еще главный поток. Можно, конечно. А вот в execute уже будет долгая операция.
    28 сен 18, 10:02    [21688784]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    YuRock
    Ну почему, конструктор же - это еще главный поток.

    Какой тогда смысл в этом окошке? Я просто смотрю в ХШ. :)
    28 сен 18, 10:03    [21688786]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    schi
    Member

    Откуда: Москва
    Сообщений: 2601
    YuRock
    svnvlad
    пропущено...

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


    Нафига ? SetPosition у ProgressBar и так объявляет недействительным нужные части окна.
    28 сен 18, 10:09    [21688788]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Василий 2
    Member

    Откуда:
    Сообщений: 309
    В данном случае поток это оверхед. Код нормальный, почему не работает как надо - непонятно.
    Пример ведет себя как надо
    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 при вызовах
    28 сен 18, 10:34    [21688820]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    roschinspb
    Member

    Откуда: С-Пб
    Сообщений: 1554
    По теме. Если надо именно окошко в отдельном thread их есть у меня.
    28 сен 18, 10:43    [21688826]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Док
    svnvlad,

    ты, вроде, уже тут наспрашивал на 4 страницы. Мало?

    Вы что-то путаете. Я на тот форум не заходил.)
    28 сен 18, 14:25    [21689100]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    wadman
    YuRock
    Ну почему, конструктор же - это еще главный поток.

    Какой тогда смысл в этом окошке? Я просто смотрю в ХШ. :)

    Эээ... отображать прогресс цикла выполнения SQL-запросов.
    28 сен 18, 14:27    [21689103]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Василий 2
    В данном случае поток это оверхед. Код нормальный, почему не работает как надо - непонятно.
    Пример ведет себя как надо
    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 не успевает обновляться. То ли сообщения не доходят, то ли не считает нужным немедленно на них реагировать.
    28 сен 18, 14:29    [21689106]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    zinpub
    Member

    Откуда:
    Сообщений: 296
    Ну и добавь invalidate и sleep, раз в N-дцать записей
    28 сен 18, 14:36    [21689113]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    То ли сообщения не доходят, то ли не считает нужным немедленно на них реагировать.

    Создал модальное окно, запустил поток.
    Поток шлет свой счетчик этому окну.
    Поток закончился, окно закрылось.
    28 сен 18, 15:07    [21689161]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    zinpub
    Member

    Откуда:
    Сообщений: 296
    Было, делал...

    Модальное окно, которое по таймеру читало из БД значение прогресса.
    т.к. Процедура была на той стороне, да ещё и в много потоков запускалась
    28 сен 18, 15:17    [21689177]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    zinpub
    Ну и добавь invalidate и sleep, раз в N-дцать записей

    Нет, все бесполезно, и sleep, и Repaint, и Application.ProcessMessages делал, не помогает. Лучше напишу поток.
    28 сен 18, 15:22    [21689183]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    zinpub
    Member

    Откуда:
    Сообщений: 296
    Проблема в чём то ином, ProcessMessages для прогрессбара вполне достаточно, хотя и кривовато
    28 сен 18, 15:47    [21689225]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    А вот таким образом правильно будет по завершении работы потока получить из него результат выполнения (id первой обновленной записи)?
    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 примерно такой:
    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;
    
    28 сен 18, 15:51    [21689230]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    В общем нужно после отрабатывания всех SQL-запросов, которые засунуты в поток (после завершения работы потока), обновить основную сетку с данными и позиционировать курсор (Locate) на ту запись, id которой будет храниться внутри потока. Как это грамотно сделать?
    28 сен 18, 15:55    [21689239]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    Как это грамотно сделать?

    Посмотри туда https://github.com/wadman/wthread
    28 сен 18, 15:57    [21689244]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    svnvlad
    zinpub
    Ну и добавь invalidate и sleep, раз в N-дцать записей

    Нет, все бесполезно, и sleep, и Repaint, и Application.ProcessMessages делал, не помогает. Лучше напишу поток.

    Куда тебе еще поток, ты прогрессбаром разобраться не можешь...
    28 сен 18, 17:05    [21689342]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    QT
    Guest
    Изначально вопрос был про ProgressBar.
    И вот этот пример кода показывает, что ProgressBar нормально отображается и без потоков и без каких-либо ProcessMessages() / Repaint() / Update() / Invalidate().
    Надо смотреть подробнее. Сделайте вывод в логи.
    28 сен 18, 17:12    [21689351]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    schi
    YuRock
    пропущено...
    Перед Update еще Invalidate надо, я забыл, или сразу Repaint - он и то и то вызовет.


    Нафига ? SetPosition у ProgressBar и так объявляет недействительным нужные части окна.
    Если так (что логично и скорей всего, просто нет щас уозможности исходники посмотреть) - тогда не надо. Значит, ошибка в логике, и тогда ничего не поможет, кроме исправления её.
    28 сен 18, 22:32    [21689601]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    svnvlad
    То ли сообщения не доходят, то ли не считает нужным немедленно на них реагировать.
    Нет, всё всегда работает в соответствие с жокументацией по винапи. За исключением редких багов, которые в основном давно вылизаны и пофикшены.
    28 сен 18, 22:35    [21689604]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    zinpub
    Ну и добавь invalidate и sleep, раз в N-дцать записей
    слип бесполезен, а инвалидэйта мало - нужен апдейт. Так говорит документация, а жизнь показывает, что она не врет в данном случае.
    Так что тыкать пальцем в небо - просто потеря времени.
    28 сен 18, 22:37    [21689608]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    zinpub
    Проблема в чём то ином, ProcessMessages для прогрессбара вполне достаточно, хотя и кривовато
    Не достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.
    28 сен 18, 22:38    [21689609]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    YuRock
    zinpub
    Проблема в чём то ином, ProcessMessages для прогрессбара вполне достаточно, хотя и кривовато
    Не достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.
    Даже точнее так: после ProcessMessages винда пошлет WM_PAINT через PostMessage (добавит в очередь), но обработка этого сообщения не начнется сразу, т.к. пойдет выполнение дальнейшего кода программы, в итоге - окно с прогрессбаром не перерисуется (когда надо).
    28 сен 18, 22:43    [21689612]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    YuRock
    YuRock
    пропущено...
    Не достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.
    Даже точнее так: после ProcessMessages винда пошлет WM_PAINT через PostMessage (добавит в очередь), но обработка этого сообщения не начнется сразу, т.к. пойдет выполнение дальнейшего кода программы, в итоге - окно с прогрессбаром не перерисуется (когда надо).

    Все правильно.

    Котовасия
    Куда тебе еще поток, ты прогрессбаром разобраться не можешь...

    Сами попробуйте обновлять прогрессбар в цикле MySQL. Сто раз уже такое встречал, что замораживается до конца цикла, просто руки не доходили основательно решить вопрос.
    28 сен 18, 22:57    [21689619]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Василий 2
    В данном случае поток это оверхед. Код нормальный, почему не работает как надо - непонятно.
    Пример ведет себя как надо
    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.
    // 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;
    


    К сообщению приложен файл. Размер - 18Kb
    28 сен 18, 23:09    [21689625]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Вторая

    К сообщению приложен файл. Размер - 21Kb
    28 сен 18, 23:09    [21689627]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Третья

    К сообщению приложен файл. Размер - 22Kb
    28 сен 18, 23:10    [21689628]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Результат

    К сообщению приложен файл. Размер - 26Kb
    28 сен 18, 23:10    [21689629]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    И это немудрено, во время висения диалоговых ShowMesage-й у программы достаточно времени, чтобы обработать все сообщения.
    28 сен 18, 23:12    [21689631]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    svnvlad
    ...
    Котовасия
    Куда тебе еще поток, ты прогрессбаром разобраться не можешь...

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


    Вот тебе код, повесь его "на кнопку", попробуй - заработает ли.
    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
    28 сен 18, 23:13    [21689633]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    krapotkin
    Member

    Откуда: Екатеринбург
    Сообщений: 637
    тут вроде в правилах нет ограничений на ссылки
    я писал статью, где ваш случай подробно описан
    29 сен 18, 08:38    [21689734]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3631
    Котовасия
    svnvlad
    ...
    пропущено...

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


    Вот тебе код, повесь его "на кнопку", попробуй - заработает ли.
    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
    Вряд ли заработает. Тут та же проблема, что и у ТС, идентичная.
    29 сен 18, 09:19    [21689739]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    andreymx
    Member

    Откуда: Запорожье
    Сообщений: 49160
    svnvlad
    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-процедуру предлагали?
    29 сен 18, 11:05    [21689767]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    schi
    Member

    Откуда: Москва
    Сообщений: 2601
    YuRock
    YuRock
    пропущено...
    Не достаточно, винда пошлет WM_PAINT только после того, как очередь освободится, а надо сразу.
    Даже точнее так: после ProcessMessages винда пошлет WM_PAINT через PostMessage (добавит в очередь), но обработка этого сообщения не начнется сразу, т.к. пойдет выполнение дальнейшего кода программы, в итоге - окно с прогрессбаром не перерисуется (когда надо).


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

    Нет никаких Invalidate, Update и прочих действий. Где-то я читал (не найду сейчас), что ProgressBar отличается от остальных контролов тем, что при установке позиции он сам вызывает UpdateWindow
    29 сен 18, 11:39    [21689784]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    YuRock
    Котовасия
    пропущено...


    Вот тебе код, повесь его "на кнопку", попробуй - заработает ли.
    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
    Вряд ли заработает. Тут та же проблема, что и у ТС, идентичная.

    Это рабочий код.
    29 сен 18, 12:21    [21689811]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Котовасия
    YuRock
    пропущено...
    Вряд ли заработает. Тут та же проблема, что и у ТС, идентичная.

    Это рабочий код.

    Шаман однако.
    На кнопке код работал. Попробовал встроить в SQL-цикл. Тоже показал прогресс. Затем закомментировал этот код и оставил свой код как было, убрал даже ProcessMessages и Repaint где они были. Все заработало нормально. В коде НИЧЕГО не менял. Но вчера он не работал, а сегодня работает. Одно замечание - вчера работало все медленно, сегодня быстро, т.е. связь с сервером лучше. Вчера обработка 3 запросов занимала где-то 3 секунды, сегодня доли секунды. Может быть с этим связано?
    29 сен 18, 23:37    [21690142]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Даже так - прежде, чем начал тестировать этот код, заметил, что мое окно с прогресс барами работает нормально.
    29 сен 18, 23:38    [21690144]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Вчера день потратил на написание класса Thread-а, а сегодня оказалось, что работает без него. Дельфи издевается?
    29 сен 18, 23:40    [21690147]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    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;
    
    29 сен 18, 23:41    [21690148]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    svnvlad,

    не надо сразу сломя голову искать черную кошку...
    29 сен 18, 23:45    [21690149]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Котовасия
    svnvlad,

    не надо сразу сломя голову искать черную кошку...

    В смысле? Я вижу, что код нестабилен. Вчера не работало, сегодня работает. Что будет завтра - неизвестно.
    29 сен 18, 23:48    [21690152]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Предполагаю, что зависание сервера (вернее связи с сервером) мешает работе VCL.
    29 сен 18, 23:49    [21690154]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    svnvlad
    Предполагаю, что зависание сервера (вернее связи с сервером) мешает работе VCL.

    Это п....ц, дорогая редакция.
    29 сен 18, 23:58    [21690160]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    andreymx
    выбросить код slow-by-slow и написать sp-процедуру предлагали?

    Что такое slow-by-slow и sp-процедура?
    30 сен 18, 00:09    [21690165]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    svnvlad,

    это ты плохому от 79850 набрался. Сам он по себе человек хороший, но воспринимать сообщения технического плана от него не нужно, у него интересные взгляды на "внутреннюю реализацию", но они не вполне соответствуют официальным, а широта взглядов по отношению к у уже реализованным техническим системам чревата учащением случаев принятия не всегда верных решений...
    30 сен 18, 00:12    [21690166]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    MinGW
    Member

    Откуда:
    Сообщений: 11
    krapotkin
    я писал статью, где ваш случай подробно описан

    Простите, но у него как раз нет потоков. :) Он собрался их прикручивать, но они там как бы совсем не нужны.
    schi
    Где-то я читал (не найду сейчас), что ProgressBar

    Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.
    1 окт 18, 10:04    [21690784]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    roschinspb
    Member

    Откуда: С-Пб
    Сообщений: 1554
    svnvlad
    Котовасия
    svnvlad,

    не надо сразу сломя голову искать черную кошку...

    В смысле? Я вижу, что код нестабилен. Вчера не работало, сегодня работает. Что будет завтра - неизвестно.
    Прикручивание изолентой многопоточности стабильности не добавит. Сколько не встречал таких поделий, а результат такой, что случайно в одном из трех случаев приложение вылетает из системы... так что советую обновить резюме и отгулять накопившийся отпуск перед тем, как делать релиз
    1 окт 18, 11:47    [21690928]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    andreymx
    Member

    Откуда: Запорожье
    Сообщений: 49160
    roschinspb
    svnvlad
    пропущено...

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

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

    Работает уже лет 10-12
    1 окт 18, 14:14    [21691245]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    MinGW
    krapotkin
    я писал статью, где ваш случай подробно описан

    Простите, но у него как раз нет потоков. :) Он собрался их прикручивать, но они там как бы совсем не нужны.
    schi
    Где-то я читал (не найду сейчас), что ProgressBar

    Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.

    Сегодня опять не перерисовывается. Так что нужны они.
    1 окт 18, 16:23    [21691513]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Котовасия
    svnvlad,

    это ты плохому от 79850 набрался.

    Кто это? Там нет такого пользователя. Заинтриговали.
    1 окт 18, 16:24    [21691515]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    roschinspb
    svnvlad
    пропущено...

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

    Вы просто не умеете их готовить.)
    У меня в программе код автообновления программы написан на Thread-е. Очень четко и стабильно работает. ("Вы можете продолжать работать во время обновления").
    1 окт 18, 16:25    [21691519]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    MinGW
    Он собрался их прикручивать, но они там как бы совсем не нужны.
    Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.

    Есть другая программа, закидывает файлы на сервер обновлений. Там тоже прогрессбар морозится, это не единичный случай. Просто руки не доходят переписать на поток.
    1 окт 18, 16:27    [21691526]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    krapotkin
    тут вроде в правилах нет ограничений на ссылки
    я писал статью, где ваш случай подробно описан

    Спасибо, толково.
    1 окт 18, 16:28    [21691529]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Можно ли в Thread-е обращаться на чтение полей из сложных подклассов?
    Например, читать из диалогового окна параметры без синхронизации?
    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;
    
    1 окт 18, 16:42    [21691556]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    Можно ли в Thread-е обращаться на чтение полей из сложных подклассов?

    В чем проблема передать их в конструктор потока?
    1 окт 18, 16:45    [21691562]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    wadman
    svnvlad
    Можно ли в Thread-е обращаться на чтение полей из сложных подклассов?

    В чем проблема передать их в конструктор потока?

    Ну там несколько разных режимов. В зависимости от режима вызывается своя функция с разными параметрами.
    // Процедуры смены собственника по уровням
        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 конструктора с разными параметрами?

    К сообщению приложен файл. Размер - 23Kb
    1 окт 18, 21:39    [21691920]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Котовасия
    Member

    Откуда:
    Сообщений: 1187
    svnvlad
    ...
    Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.

    Сегодня опять не перерисовывается. Так что нужны они.[/quot]
    Прямо вот этот вот код 21689633 перестал работать? Врешь поди.
    1 окт 18, 22:07    [21691935]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    В зависимости от режима вызывается своя функция с разными параметрами.

    Одна функция с тремя параметрами: тип операции, две id.
    2 окт 18, 07:28    [21692126]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    roschinspb
    Member

    Откуда: С-Пб
    Сообщений: 1554
    svnvlad
    ...пошаговый прогресс не отображается...

    svnvlad
    ...Все заработало нормально. В коде НИЧЕГО не менял...

    svnvlad
    ...сегодня оказалось, что работает...

    svnvlad
    ...Сегодня опять не перерисовывается...

    svnvlad
    ...Вы просто не умеете их готовить.)
    У меня в программе код автообновления программы написан на Thread-е. Очень четко и стабильно работает. ("Вы можете продолжать работать во время обновления").


    Просто у меня нет волшебного календаря, в котором отмечено в какой день какие функции отваливаются.
    2 окт 18, 10:46    [21692288]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Котовасия
    svnvlad
    ...
    Уже демонстрировали в теме - само перерисовывается, без дополнительных телодвижений.

    Сегодня опять не перерисовывается. Так что нужны они.

    Прямо вот этот вот код 21689633 перестал работать? Врешь поди.[/quot]
    Сдался вам вот это код. Я же говорю, все зависит от скорости связи интернет-канала. Когда он быстрый, прогресс обновляется, когда медленный - морозится, и отображается полностью заполненным только в конце работы SQL-запросов.
    3 окт 18, 05:34    [21693600]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    roschinspb
    svnvlad
    ...пошаговый прогресс не отображается...

    svnvlad
    ...Все заработало нормально. В коде НИЧЕГО не менял...

    svnvlad
    ...сегодня оказалось, что работает...

    svnvlad
    ...Сегодня опять не перерисовывается...

    svnvlad
    ...Вы просто не умеете их готовить.)
    У меня в программе код автообновления программы написан на Thread-е. Очень четко и стабильно работает. ("Вы можете продолжать работать во время обновления").


    Просто у меня нет волшебного календаря, в котором отмечено в какой день какие функции отваливаются.

    В те дни, когда связь тормозит, прогресс-бары замораживаются.
    3 окт 18, 05:35    [21693601]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Кстати, актуальная тема: на основной форме имеется 7 DbGrid-ов, часть из которых связаны по типу Master-Detail. Через каждые 90 секунд форма обновляется, чтобы отобразить изменения, если они, возможно, сделаны другим сетевым пользователем. Во время процесса обновления сеток (перечитывания таблиц), отображаются песочные часики, и программа перестает реагировать на любые действия пользователя. И здесь как повезет. В локалке все это происходит достаточно быстро и незаметно. Удаленному же пользователю, который коннектится через интернет, работать не столь комфортно, иногда период заморозки составляет до 10 секунд при плохом соединении.
    Так вот - можно ли как-то сделать сам процесс перечитывания данных из базы в Thread-е, а уже их отображение - в основном потоке? Думаю, это бы значительно улучшило дружественность программы к пользователям.
    3 окт 18, 05:40    [21693603]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    wadman
    svnvlad
    В зависимости от режима вызывается своя функция с разными параметрами.

    Одна функция с тремя параметрами: тип операции, две id.

    Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.
    3 окт 18, 05:43    [21693604]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    wadman
    пропущено...

    Одна функция с тремя параметрами: тип операции, две id.

    Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.

    Это ничего не меняет. Тип операции, старый ид, новый ид.
    Уж по операции то сумеешь определить, что к чему?
    3 окт 18, 07:37    [21693625]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    wadman
    svnvlad
    пропущено...

    Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.

    Это ничего не меняет. Тип операции, старый ид, новый ид.
    Уж по операции то сумеешь определить, что к чему?

    Ну да, можно же присвоить в зависимости от типа.
    3 окт 18, 10:17    [21693744]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    roschinspb
    Member

    Откуда: С-Пб
    Сообщений: 1554
    svnvlad
    Через каждые 90 секунд форма обновляется, чтобы отобразить изменения, если они, возможно, сделаны другим сетевым пользователем ... период заморозки составляет до 10 секунд при плохом соединении.
    Так вот - можно ли как-то сделать сам процесс перечитывания данных из базы в Thread-е, а уже их отображение - в основном потоке? Думаю, это бы значительно улучшило дружественность программы к пользователям.

    Ну, капитан Очевидность задал бы вопрос: "Что будет, если 10 пользователей при плохом соединении будут постоянно перечитывать данные?"
    Как-то процесс перечитывания можно сделать так:
    Соединение с БД и все запросы должны создаваться и выполняться в самом Thread, можно всё что нужно для TTread вынести в отдельный TDataModule и при чтении создавать и разрушать его. Внутри TThread после загрузки всех наборов данных, копируем их содержимое (см. метод Synchronize) в какие-нибудь наборы данных в памяти (TMemDataSet, TClientDataset и т.п.), которые работают в основном потоке и показываются в гридах.
    3 окт 18, 16:12    [21694269]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    roschinspb
    Как-то процесс перечитывания можно сделать так:

    Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.
    3 окт 18, 16:18    [21694282]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    roschinspb
    Member

    Откуда: С-Пб
    Сообщений: 1554
    wadman
    roschinspb
    Как-то процесс перечитывания можно сделать так:

    Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.

    Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...
    3 окт 18, 16:29    [21694293]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    roschinspb
    wadman
    пропущено...

    Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.

    Можно еще завести спец. поле в которое автоматически заносить текущую дату при любом изменении и читать только те записи в которых значение этого поля больше времени последнего чтения. Но чето подозреваю это слишком сложно...

    Сам догадался?
    3 окт 18, 16:30    [21694295]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    roschinspb
    Но чето подозреваю это слишком сложно...

    Не совсем. Триггеры, доп.условие в where да обновление измененных записей в памяти.
    Еще решить, что делать в конфликтных ситуациях.
    3 окт 18, 16:32    [21694298]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    MinGW
    Member

    Откуда:
    Сообщений: 11
    svnvlad
    Сегодня опять не перерисовывается. Так что нужны они.

    Нет. Значит проблема в каком-то другом месте.
    Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.
    3 окт 18, 23:18    [21694678]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    roschinspb
    Member

    Откуда: С-Пб
    Сообщений: 1554
    wadman
    roschinspb
    Но чето подозреваю это слишком сложно...

    Не совсем
    Сложно в контексте Сегодня опять не перерисовывается
    4 окт 18, 12:03    [21695018]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    MinGW
    svnvlad
    Сегодня опять не перерисовывается. Так что нужны они.

    Нет. Значит проблема в каком-то другом месте.
    Может например у вас "1" выполняется 5 секунд, а "2" и "3" выполняются мгновенно? Тогда ProgressBar показывает вполне корректно.

    Нет, всё равномерно выполняется. Сейчас сделал в треде, все нормально работает, только осталась в конце ближе к уничтожению треда какая-то ошибка доступа 5 вылазит. Но по данным все записывается четко.
    4 окт 18, 19:24    [21695719]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    wadman
    roschinspb
    Как-то процесс перечитывания можно сделать так:

    Я-бы еще добавил после с датой/временем изменения на ключевые таблицы и обновление только по нему делал.

    Там есть такая проверка. Просто само обновление сеток очень долго идет. Даже когда вручную нажимаешь кнопку обновить.
    4 окт 18, 19:26    [21695720]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    Подскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
    FfmProgress.Free;

      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;
    


    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;
    


    destructor TChangeOwnerThread.Destroy;
    begin
      FfmProgress.Free;  // на этом месте возникает ошибка
      inherited;
    end;
    
    5 окт 18, 12:18    [21696236]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
        procedure InitBars;
        procedure UpdateBarPositions;
    

    Там что?
    5 окт 18, 12:34    [21696267]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    wadman,

    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;, то окошко так и остается висеть на экране.
    5 окт 18, 13:45    [21696357]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    goldmi45
    Member

    Откуда:
    Сообщений: 1065
    svnvlad,

    а если в конструктор потока передавать уже созданную форму?
    5 окт 18, 13:47    [21696361]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    Да, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.

    Просто закрывай окно, а в событии OnClose выставь action := caFree.
    5 окт 18, 13:51    [21696363]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    goldmi45
    svnvlad,

    а если в конструктор потока передавать уже созданную форму?

    То же самое.
    5 окт 18, 14:18    [21696402]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    wadman
    svnvlad
    Да, и если закомментировать в деструкторе FfmProgress.Free;, то окошко так и остается висеть на экране.

    Просто закрывай окно, а в событии OnClose выставь action := caFree.

    Теперь нормально. А почему так? Видимое окно нельзя освобождать?
    5 окт 18, 14:26    [21696411]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    goldmi45
    Member

    Откуда:
    Сообщений: 1065
    svnvlad
    goldmi45
    svnvlad,

    а если в конструктор потока передавать уже созданную форму?

    То же самое.

    Ну и в деструкторе потока не убивать форму, а уничтожать в главном потоке в событии OnTerminate потока....
    5 окт 18, 14:29    [21696415]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    softwarer
    Member

    Откуда: 127.0.0.1
    Сообщений: 54505
    Блог
    svnvlad
    Подскажите пожалуйста, что не так: возникает ошибка Access Violation. Ошибка доступа 5. При работе деструктора на строке
    FfmProgress.Free;

    Ну давай думать. Эта строчка у тебя в деструкторе. Деструктор вызывается при уничтожении потока. Уничтожение потока при FreeOnTerminate = true происходит в самом потоке. Итого, операции с формой в левом потоке. Что говорится по этому поводу в VCL?
    5 окт 18, 14:33    [21696420]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad
    wadman
    пропущено...

    Просто закрывай окно, а в событии OnClose выставь action := caFree.

    Теперь нормально. А почему так? Видимое окно нельзя освобождать?

    Потому что поток еще "работает" с окном.

    Поменяй эти две строки местами.
    svnvlad
    destructor TChangeOwnerThread.Destroy;
    begin
      FfmProgress.Free;  // на этом месте возникает ошибка
      inherited;
    end;
    
    5 окт 18, 14:43    [21696432]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    softwarer
    Уничтожение потока при FreeOnTerminate = true происходит в самом потоке.

    Этот момент упустил из виду. В общем, с caFree тогда единственный из простых вариант.
    5 окт 18, 15:06    [21696461]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    svnvlad
    Member

    Откуда:
    Сообщений: 1961
    В общем получилось красиво. Если интересно,
    в главной форме:
    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;
    


    Класс потока:
    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;
    
    .....
    
    5 окт 18, 16:34    [21696592]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    wadman
    Member

    Откуда: Санкт-Петербург
    Сообщений: 24623
    svnvlad,

    портянки стоит в спойлер прятать. :)
    5 окт 18, 20:02    [21696781]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    schi
    Member

    Откуда: Москва
    Сообщений: 2601
    svnvlad
    В общем получилось красиво. Если интересно,


    Мой совет - убрать восклицательные знаки из сообщений.
    5 окт 18, 20:50    [21696798]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    Док
    Member

    Откуда: Казань
    Сообщений: 5874
    schi
    Мой совет - убрать восклицательные знаки из сообщений.

    ... и раскрасить в постельные тона
    5 окт 18, 23:57    [21696863]     Ответить | Цитировать Сообщить модератору
     Re: Как в процессе исполнения ряда SQL-запросов отображать прогресс-бар? (thread?)  [new]
    энди
    Member

    Откуда: Киров, Россия
    Сообщений: 912
    у меня в программе окно с прогрессом и выполнение работы с БД в отдельном треде выглядит вот так

          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;
    


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

    Выглядит это так
    Картинка с другого сайта.
    6 окт 18, 11:46    [21696964]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
    Все форумы / Delphi Ответить