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

Откуда:
Сообщений: 1947
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

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

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

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

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

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

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

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

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

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

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

Откуда:
Сообщений: 1029
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Откуда:
Сообщений: 1947
Можно ли в 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

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

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

Откуда:
Сообщений: 1947
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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

Там, если заметили id то разные. У одной это id карты, у другой - id подтипа груза, у третьей - id номенклатуры, у четвертой - id партии.
3 окт 18, 05:43    [21693604]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить