powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Компонент FIB Plus Dataset
57 сообщений из 57, показаны все 3 страниц
Компонент FIB Plus Dataset
    #40001985
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
База данных: Firebird 2.5
Fib Plus Dataset через стандартный DataSource связан с ДБГридом.
Имеется sql-запрос, который выполняется около 5 секунд. Хочется, чтобы на время выполнения запроса progressbar неопределенно играл полоской.
У FibDataSet есть события BeforeOpen и AfterOpen. Используя их почему-то progressbar не реагирует на начало выполнения запроса. Реакция только по окончанию запроса (после того как данные отобразятся в DBGrid). Аналогично, когда прописываешь какие-то действия до строчки FIBDataset.Open, действия начинают происходить только по окончанию запроса.
Подскажите в каком направлении двигаться, чтобы реализовать подобную функцию?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40001988
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизация запроса.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002030
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
24.09.2020 10:17, Explosion пишет:
> Подскажите в каком направлении двигаться, чтобы реализовать подобную функцию?

в сторону потоков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002042
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Событие BeforeOpen Fib Dataset срабатывает до начала выполнения запроса?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002044
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
24.09.2020 11:48, Explosion пишет:
> Событие BeforeOpen Fib Dataset срабатывает до начала выполнения запроса?

ну а?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002071
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий

ну а?

как бы это самое, ну
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002090
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
24.09.2020 12:27, Explosion пишет:
> как бы это самое, ну

ну дык!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002129
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант вызовите ему Repaint.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002159
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у FibDataset нету event`a OnFetchRow() ?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002162
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
А у FibDataset нету event`a OnFetchRow() ?
А смысл, если у него запрос долго выполняется?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002173
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Ну и пусть себе рисует/апдейтит скроллбар свой на каждом 100м фетче...
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002175
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
24.09.2020 15:11, DarkMaster пишет:
> Ну и пусть себе рисует/апдейтит скроллбар свой на каждом 100м фетче...

у него ПЕРВЫЙ фетч только через 100500 секунд.
а последующие - быстро.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002389
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster
_Vasilisk_,

Ну и пусть себе рисует/апдейтит скроллбар свой на каждом 100м фетче...

Хватило бы, чтобы состояние прогресс бара было в режиме неопредённости. Поэтому достаточно было бы, чтобы вы подсказали точку начала действия и точку конца.
OnFetchRow() не нашёл. У запроса мало строк (группировка), поэтому толку в Fetch'ивании нет в данном случае.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002414
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Explosion,

А если в BeforeOpen, после включения прогрессбара, вставить богомерзкий Application.ProcessMessages?..
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40002432
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Explosion
DarkMaster
_Vasilisk_,

Ну и пусть себе рисует/апдейтит скроллбар свой на каждом 100м фетче...

Хватило бы, чтобы состояние прогресс бара было в режиме неопредённости. Поэтому достаточно было бы, чтобы вы подсказали точку начала действия и точку конца.
OnFetchRow() не нашёл. У запроса мало строк (группировка), поэтому толку в Fetch'ивании нет в данном случае.

Запрос выполняется синхронно, то есть приложение будет "заморожено" до тех пор, пока сервер БД не пришлет ответ.
Если хочешь "шевеления" в процессе ожидания - используй нити, тебе сразу написали об этом.
Выноси в отдельную нить либо запрос, либо отображение картинки, другого пути нет.
С использованием TpFibDataSet как источника данных грида, в отдельную нить, скорее всего, придется выносить картинку.Ибо "стандартные" компоненты не предусматривают асинхронную работу.
Или все придется делать руками, используя свой датасет, асинхронно взаимодействуюший с нитью загрузки данных.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40003474
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp
Explosion,

А если в BeforeOpen, после включения прогрессбара, вставить богомерзкий Application.ProcessMessages?..

Если вставить в BeforeOpen - не работает, если вставить перед строчкой кода dataset.open, то на долю секунды "размораживает" приложение и полоска прогрессбара чуть сдвигается и вновь "замерзает".

ъъъъъ
Explosion
пропущено...

Хватило бы, чтобы состояние прогресс бара было в режиме неопредённости. Поэтому достаточно было бы, чтобы вы подсказали точку начала действия и точку конца.
OnFetchRow() не нашёл. У запроса мало строк (группировка), поэтому толку в Fetch'ивании нет в данном случае.

Запрос выполняется синхронно, то есть приложение будет "заморожено" до тех пор, пока сервер БД не пришлет ответ.
Если хочешь "шевеления" в процессе ожидания - используй нити, тебе сразу написали об этом.
Выноси в отдельную нить либо запрос, либо отображение картинки, другого пути нет.
С использованием TpFibDataSet как источника данных грида, в отдельную нить, скорее всего, придется выносить картинку.Ибо "стандартные" компоненты не предусматривают асинхронную работу.
Или все придется делать руками, используя свой датасет, асинхронно взаимодействуюший с нитью загрузки данных.

К сожалению не догадываюсь что такое "нити", но правильно ли всё понял: в догонку к sql-запросу из датасета параллельной транзакцией запускаем запрос-близнец через, например, query-компонент и по нему ориентируем анимацию прогресс бара?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40003488
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Печаль. :(
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40003501
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь. Загуглил и понял, что речь о Thread.
Мимопроходящий

в сторону потоков.

Теперь понятно про что речь.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40005704
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал для полоски прогрессбара отдельный поток, но проблема сохранилась. Во время выполнения запроса форма "замораживается".
На модуле формы располагается dataset, кнопка и progressbar:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TNewThread.Execute;
var i: integer;
begin
  Synchronize(SetProgress);
end;

procedure TNewThread.SetProgress;
begin
  frmOtchetD.ProgressBarD.Visible := True;
  frmOtchetD.ProgressBarD.Style := pbstMarquee;
end;

procedure TfrmOtchetD.ButtonOkClick(Sender: TObject);
begin
    NewThread:=TNewThread.Create(true);
    NewThread.FreeOnTerminate:=true;
    NewThread.Priority:=tpLower;
    NewThread.Resume;

    dstOtchetD.Open;

    frmOtchetD.ProgressBarD.Style := pbstNormal;
    ProgressBarD.Visible := False;
end;



Как думаете, проблема в этом:
ъъъъъ
отдельную нить, скорее всего, придется выносить картинку.Ибо "стандартные" компоненты не предусматривают асинхронную работу.
?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40005708
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Execute() надо выносить всю работу с БД, а не настройку прогрессбара...
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40005713
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Explosion,

имхо, в поток выносить открытие датасета (что проще), если он позволяет (не работал с ним), или окно прогресса, но! целиком на WinApi. делал такое для возможности отмены запроса в SDAC

типа такого
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40005727
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Explosion, вы это ( 22203248 ) делали? Думается, что вам проще оптимизировать запрос, чем понять, как сделать индикацию выполнения запроса.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40005741
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Explosion,

ну ты сам подумай: чтобы прогрессбар шевелился, его кто-то должен "толкать". Кто у тебя его толкать будет, если основная нить ожидает завершения запроса?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40005755
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Explosion,

делай так: вывешивай модальное окно с анимацией и кнопкой " Отмена".

В параллельной нити - коннект к базе, ожидание аыполнения запроса. По готовности клонируешь данные в контекст основной нити. При нажатии кнопки "Отмена" - посылаешь в нить работы с базой сообщение, там все независимо дождется завершения и терминируется. Но - тоже, зависон при работе с длинным запросом никуда не денется, или используй особые средства работы с ФБ доя прерывания запроса, либо жди завершения.

Самое верное - оптимизировать запрос, рпзделить его, изменить.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40005981
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделай так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TfrmOtchetD.ButtonOkClick(Sender: TObject);
begin
    NewThread:=TNewThread.Create(true);
    NewThread.FreeOnTerminate:=true;
    NewThread.Priority:=tpLower;
    NewThread.Resume;

    dstOtchetD.Open;
    frmOtchetD.ProgressBarD.Style := pbstNormal;
    NewThread.Start;

    while not NewThread.Terminated do
    begin
       Application.ProcessMessages;
       Sleep(50);
    end;
    ProgressBarD.Visible := False;
end;



И не обращай внимания на окружающих, когда начнут ссаными тапками кидаться. Когда разберешься с другими способами оживить основной поток, код поправишь :)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006331
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
сделай так:
Где вероятный AV показать или сам найдешь?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006414
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Где вероятный AV показать

покажи, только пальцем :)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006420
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никогда не стоит делать вот так.
Код: pascal
1.
2.
3.
4.
5.
 while not NewThread.Terminated do
    begin
       Application.ProcessMessages;
       Sleep(50);
    end;



Но код Дока слава богу работать не будет.
dstOtchetD.Open;
пока не отработает в основном потоке до художеств с Application.ProcessMessages не дойдет.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006587
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
покажи, только пальцем :)

Док
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TfrmOtchetD.ButtonOkClick(Sender: TObject);
begin
    NewThread:=TNewThread.Create(true);
    NewThread.FreeOnTerminate:=true;  // Вызвать деструктор по завершению потока
    NewThread.Priority:=tpLower;
    NewThread.Resume;

    dstOtchetD.Open;
    frmOtchetD.ProgressBarD.Style := pbstNormal;
    NewThread.Start;

    // Идет проверка значения поля объекта, который не факт, что существует
    while not NewThread.Terminated do  
    begin
       Application.ProcessMessages;
       Sleep(50);
    end;
    ProgressBarD.Visible := False;
end;

...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006814
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

тебя смущает, что поток может быть не создан? Ну дык, или делай FreeOnTerminate = False и прибивай вручную (я обычно так и делаю), или проверяй наличие объекта. Или я неправильно мыслю? Или ты хочешь универсально-эффективный код привести? :)


Mixrud,

да, вы верно подметили. В контексте задачи ТС ему бы коннект в доп.потоке сделать, а наружу вывести модальный сплэш. Согласен.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006824
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
_Vasilisk_,
тебя смущает, что поток может быть не создан? Ну дык, или делай FreeOnTerminate = False и прибивай вручную (я обычно так и делаю), или проверяй наличие объекта. Или я неправильно мыслю? Или ты хочешь универсально-эффективный код привести? :)

Его смущает, что за время выполнения кода между 'NewThread.Resume' и 'while not NewThread.Terminated do' поток может уже завершиться и освободиться, поэтому NewThread (.Terminated) будет указывать на мусор. Более того, как только поток завершится то NewThread (.Terminated) гарантированно будет указывать на мусор, и будет там AV или нет зависит только от того - успеет ли кто-нибудь переписать память, на которую указывает NewThread.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006848
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
mea culpa.

Потер предыдущее сообщение, потому что при практически любом раскладе получается хрень: если FreeOnTerminate = True, то при уничтожении экземпляра NewThread там все равно остается мусор (т.е. NewThread <> nil), а значит _Vasilisk_ прав в отношении возможного AV.

Вот кстати вопрос, а если в деструкторе TNewThread сделать так:
Код: pascal
1.
2.
3.
4.
5.
destructor TNewThread.Destroy;
begin
  self:= nil;
  inherited;
end;



то всяческие проверки Assigned() прокатят?

ps. насчет ProcessMessages я так ни разу и не услышал убедительных аргументов, почему его не стоит применять.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006873
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;


  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FMyThread: TMyThread;
    procedure OnThreadTerminated(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(FMyThread) then
  begin
    FMyThread := TMyThread.Create(True);
    FMyThread.FreeOnTerminate := True;
    FMyThread.OnTerminate := OnThreadTerminated;
    ProgressBar1.Style := pbstMarquee;
    ProgressBar1.Visible := True;
    FMyThread.Start;
  end;
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
  inherited;
  //Длительный Open
  Sleep(5000);
end;

procedure TForm1.OnThreadTerminated(Sender: TObject);
begin
  FMyThread := nil;
  ProgressBar1.Visible := False;
end;
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40006887
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
то всяческие проверки Assigned() прокатят?
Нет. У тебя получится по сути так
Код: pascal
1.
2.
3.
4.
a := 5;  // NewThread := TNewThread.Create;
b := a;  // NewThread.DoSomething
b := 0;  // Self := nil
if a <> 0 then  // if Assigned(NewThread)


Док
ps. насчет ProcessMessages я так ни разу и не услышал убедительных аргументов, почему его не стоит применять.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  GVar: Integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  Li: Integer;
begin
  GVar := 0;
  for Li := 0 to 1000000 do begin
    Application.ProcessMessages;
    Inc(GVar);
  end;
  ShowMessage(IntToStr(GVar));
end;

запусти программу и понажимай несколько раз кнопку
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007013
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
запусти программу и понажимай несколько раз кнопку

а тут-то оно (ProcessMessages) зачем?

istrebitel,
гуд, возьму на заметку
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007014
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.10.2020 16:32, Док пишет:
> а тут-то оно (ProcessMessages) зачем?

наглядное пособие
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007036
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
запусти программу и понажимай несколько раз кнопку

Ну так и болгаркой можно что-то нужное отхватить, но это ж не повод её запретить.
Просто надо понимать, как всё работает. Тогда и PM не страшен
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007039
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.10.2020 17:26, Fr0sT-Brutal пишет:
> Ну так и болгаркой можно что-то нужное отхватить, но это ж не повод её запретить.
> Просто надо понимать, как всё работает. Тогда и PM не страшен

не надо пользовать то что надо не так как надо!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007096
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
а тут-то оно (ProcessMessages) зачем?
Ну по классике же "чтобы не замирал интерфейс при длительных вычислениях"

Чем мой пример принципиально отличается от твоего?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007306
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Чем мой пример принципиально отличается от твоего?

в твоем примере без PM интерфейс должен замереть?

Мимопроходящий
не надо пользовать то что надо не так как надо!

Саш, может ты мне вразумительно сможешь донести?
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007324
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Саш, может ты мне вразумительно сможешь донести?
Ты же уже понял, что длительную операцию с "отрисовкой" местами перепутал?
Да и вообще в цикле так проверять и РМить при использовании потоков срамно.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007457
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
РМить при использовании потоков срамно.

Вот это я никак в толк не возьму. Почему срамно-то? Если я не хочу модальное окно вешать, а хочу, скажем, чтобы результат работы доп. потока в мемо основного потока выводился? Есть ещё какой кошерный способ для таких случаев? Допустим, AV мы не боится, потому что поток создаём и прибиваем ручками в try..finally.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007477
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док> чтобы результат работы доп. потока в мемо основного потока выводился?

Какой результат работы, если он тупо висит на Open, там
никаких прогресс-баров быть не может, максимум - анимашка.

> Есть ещё какой кошерный способ для таких случаев?

Каких "таких"? Если дождаться конца фонового выполнения
и создаётся/завершается/уничтожается корректно и вручную и
не хочется возиться с сообщениями и т.д. - вполне достаточно
дождаться OnTerminate, это будет корректно.

Чем будет в это время заниматься главный поток - без никаких
циклов - личное дело пользователя (который может захотеть
ещё что-нибудь запустить/понажимать) и разработчика, если
нужно пользователя ограничить (не дать запустить фоновое
действие повторно, например).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007553
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

ты опять по диагонали топик прочитал ;) Я уже написал, что в случае с кодом ТС я ошибся. А дальше пошел оффтоп. И мои вопросы к непосредственной теме уже имеют перпендикулярное отношение
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007666
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
в твоем примере без PM интерфейс должен замереть?
А ты подвигай окошко
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40007883
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Док
в твоем примере без PM интерфейс должен замереть?
А ты подвигай окошко

без PM я даже до заголовка не успеваю дотянуться, сразу вылезает ShowMessage. А с PM все двигается корректно, единственное, окно закрыть не удается. Но мне кажется, что твой пример с нежелательностью PM надуман, ибо оно здесь и так нафиг не сдалось :)

...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008013
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
без PM я даже до заголовка не успеваю дотянуться, сразу вылезает ShowMessage.
Блин, ну нельзя же так тормозить. Ну замедли цикл. Увеличь на пару порядков число итераций, добавь вычисления. В крайнем случае добавь в цикл Sleep(100)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008659
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

да, в этом случае ты формально прав - без PM гуй фризится насмерть.

ИМХО, это просто архитектурно неправильное решение, а не потому PM плохой. Ладно, надоело спорить. Появятся аргументы, напишу :)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008669
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

кстати, если твой пример немного переделать, то он вполне жизнеспособен
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
  TForm1 = class(TForm)
  ...
  private
    FVar, FCnt: PtrUInt;
    FIsAllow: Boolean;
...
procedure TForm1.btnStartClick(Sender: TObject);
var Li: PtrInt;
begin
  Inc(FCnt);
  Label1.Caption:= Format('Кнопка Start нажата: %d раз',[FCnt]);

  if not FIsAllow then Exit;
  FIsAllow:= False;
  FVar:= 0;

  for Li := SmallInt.MinValue to SmallInt.MaxValue do
  begin
    if FIsAllow then Break;
    Inc(FVar);
    //Sleep(10);
    Label2.Caption:= Format('Текущее значение FVar: %d',[FVar]);
    Label3.Caption:= Format('Текущее значение счетчика итераций Li: %d',[Li]);
    Application.ProcessMessages;
  end;

  if not FIsAllow then
  begin
    FCnt:= 0;
    ShowMessage(IntToStr(FVar));
  end;
  FIsAllow:= True; 
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  FIsAllow:= True;
end;





ps. а вообще, я уже забыл, о чем мы спорили :)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008711
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, :)

Спор был о том, что корректно или нет использовать Application.ProcessMesages
Сама по себе эта функция не опасна, как и любой инструмент. Просто нужно правильно его использовать.
Application.ProcessMesages "проталкивает" очередь сообщений. И если в этой очереди сообщений попадётся сообщение, которое инициирует запуск того же цикла (как привёл пример _Vasilisk_), то может случиться конфуз. :)
В вашем примере вы флагом не даёте циклу начаться заново. И в данном случае нет ничего страшного в использовании Application.ProcessMesages.

ЗЫ: А ТС свалил, так и не сказав, к чему он пришёл, сделал ли визуализацию или что-то ещё... ))
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008806
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
14.10.2020 23:01, Док пишет:
> ИМХО, это просто архитектурно неправильное решение, а не потому PM плохой.

то что ты пытаешься сделать, это т.н. "кооперативная многозадачность".
при которой условные "потоки" делятся друг с другом процессорными ресурсами.
ничего крамольного в этом конечно нет, но это жуткая архаика и атавизмЪ.
так работали ОСи типа Фодос, Win(до 3.Х), MacOS-и(до System 7) и прочие,
в эпоху до исторического материализЪма.
сейчас так делать уже не комильфо.
ибо практически все современные ОСи позволяют писать реальные многопоточные приложения.
в кошерных концепциях Win-приложений принято выделять ГЛАВНЫЙ(master) поток,
в котором крутится очередь обработки оконных сообщений (и соответственно отрисовка)
и ПОДЧИНЁННЫЕ(slave) потоки, которые занимаются вычислениями, операциямы ввода-вывода и т.п.
рисовать из slave-потока - ломать кошерную концепцию.
ну примерно как жрать мацу с салом(свинячим).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008905
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий

сейчас так делать уже не комильфо.

Да нет, по большому счету, это нечто вроде конструкции await. Косоватое, но при должной аккуратности безвредное. А аккуратность при обращении с потоками и так должна присутствовать. Ну и соответствующие методы, которые могут вызывать РМ, неплохо как-то по-особенному называть или комментировать, чтобы через год не наткнуться на грабли.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008926
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
рисовать из slave-потока - ломать кошерную концепцию.

в очень ограниченных случаях это приходится делать, но в разумных пределах. Главное, чтобы работало без ошибок. А уж с какого конца разбивать яйцо - дело вкуса.
зы. в этом 22211389 примере цикл вообще должен быть вынесен в доп.поток.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008946
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
кстати, если твой пример немного переделать
Да. О том и речь, что нужно понимать, когда стреляешь в ногу.
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008949
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
15.10.2020 15:37, _Vasilisk_ пишет:
> Да. О том и речь, что нужно понимать, когда стреляешь в ногу.

непременно нужно озаботиться анестезией.
превентивно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008956
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо зафиксированный пациент в анестезии не нуждается. - (с)
...
Рейтинг: 0 / 0
Компонент FIB Plus Dataset
    #40008986
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вас, нафик!
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Компонент FIB Plus Dataset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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