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

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

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

ну а?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Теперь понятно про что речь.
...
Рейтинг: 0 / 0
06.10.2020, 13:39
    #40005704
Explosion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компонент FIB Plus Dataset
Создал для полоски прогрессбара отдельный поток, но проблема сохранилась. Во время выполнения запроса форма "замораживается".
На модуле формы располагается 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
06.10.2020, 13:49
    #40005708
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компонент FIB Plus Dataset
В Execute() надо выносить всю работу с БД, а не настройку прогрессбара...
...
Рейтинг: 0 / 0
06.10.2020, 14:00
    #40005713
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компонент FIB Plus Dataset
Explosion,

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

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

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

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

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

Самое верное - оптимизировать запрос, рпзделить его, изменить.
...
Рейтинг: 0 / 0
06.10.2020, 23:26
    #40005981
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Компонент FIB Plus Dataset
сделай так:
Код: 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Компонент FIB Plus Dataset / 25 сообщений из 57, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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