Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Индикатор при выполнении запроса


VadimSpb ©   (2006-08-07 18:07:00) 

Добрый день!
Выполнение сложного запроса может продолжаться до минуты и более. Как можно показать особо нетерпеливым пользователям, что все ОК? Песочные часы многие воспринимают как символ зависания компьютера. ProgressBar практически неосуществим. Пробовал включать анимацию в GIF-e, но она останавливается при выполнении запроса. Кто как решает этот вопрос?


ANB   (2006-08-09 09:35:00) [1]


> VadimSpb   (08.08.06 21:45) [17]

собственно фетч обычно выполняется довольно быстро. И, кстати, есно, обработчик не будет вызываться для каждой записи, это вызвало бы еще большие тормоза.

Лучший совет у
> Petr V. Abramov ©   (08.08.06 23:16) [18]
, но я бы еще посмотрел в сторону оптимизации запроса (и подключения нужных индексов)


Petr V. Abramov   (2006-08-08 23:16:00) [2]

на время выполнения запроса показать форму с надписью " а теперь можете откинуться на спинку кресла..." и нетерпение исчезнет :)


VadimSpb   (2006-08-08 21:45:00) [3]

На простом запросе SELECT * FROM TABLE1 вроде работает.
Чудеса начинаются на конструкции типа

> SELECT S.Data
> (SELECT ISNULL(SUM(DS.Summa),0)
> FROM  Debtors AS DS
> WHERE DS.Data <= S.Data) AS All_DEBT
> FROM
> (SELECT PaymentDate AS Data  FROM Payments) AS S

Индикатор принимает только 2 положения (86 и 100), причем в положении 86 не прорисовывается. Понятно, что эти цифры абстрактны. Суть в том, что при таком запросе в ADODataSet1FetchProgressпопадаем только 2 раза.


VadimSpb   (2006-08-08 21:02:00) [4]

Не понятно, почему не удается.


Anatoly Podgoretsky   (2006-08-08 20:59:00) [5]

Какая буква не понятна?


VadimSpb   (2006-08-08 20:56:00) [6]

Что означает сообщение
"Не удается выполнить операцию во время асинхронного выполнения"?


VadimSpb   (2006-08-08 17:08:00) [7]


> ADODataSet1.ExecuteOptions:=[eoAsyncExecute, eoAsyncFetch,
>  eoAsyncFetchNonBlocking];

При этих опциях выдает "A connection component is required for async ExecuteOptions".


isasa   (2006-08-08 10:53:00) [8]

Да, забыл. :)
DataSource1.DataSet:=ADODataSet1;
Постоянно.


isasa   (2006-08-08 10:49:00) [9]

VadimSpb   (08.08.06 09:51) [9]
Вообще, вариант с потоками кажется перспективным.

А какая разница.
Возни с событийностью(начал/закончил) та же, если не больше. Плюс при синхронном чтении откуда получить индикатор чтения набора данных(степень заполнения кеша на клиенте)?


isasa   (2006-08-08 10:43:00) [10]

На работе нашел тестовый пример. Работает.

 TForm1 = class(TForm)
   ADOConnection1: TADOConnection;
   ADODataSet1: TADODataSet;
   DataSource1: TDataSource;
   DBGrid1: TDBGrid;
   ...
 end;
...
procedure TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
 const Error: Error; var EventStatus: TEventStatus);
begin
 if EventStatus=esOK then
   DBGrid1.DataSource:=DataSource1;
end;

procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
 Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
 dxfProgressBar1.Position:=Progress div MaxProgress * 100;
 dxfProgressBar1.Update;
 StaticText1.Caption:=format('%d/%d/%d',[Progress, MaxProgress, DataSet.RecordCount]);
 StaticText1.Update;
end;


В дизайн-моде

ADOConnection1.ConnectOptions:=coAsyncConnect;

ADODataSet1.ExecuteOptions:=[eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking];

DBGrid1.DataSource:=nil;


VadimSpb   (2006-08-08 09:51:00) [11]


> isasa ©   (08.08.06 09:00) [8]

Помогает на пару секунд :-)))
Надо почитать об особенностях асинхронного выполнения.
Вообще, вариант с потоками кажется перспективным.


isasa   (2006-08-08 09:00:00) [12]

TADOConnection.ConnectOptions:=coAsyncConnect ?


VadimSpb   (2006-08-07 22:50:00) [13]


> isasa ©   (07.08.06 22:28) [6]

Ругается: "Не удается выполнить операцию асинхронного выпонения"


isasa   (2006-08-07 22:28:00) [14]

Если TADODataSet, то
TADODataSet.ExecuteOption := eoAsyncExecute ?


VadimSpb   (2006-08-07 18:53:00) [15]

TGIFImage просто уже был установлен.
TAnimate не пробовал.


clickmaker   (2006-08-07 18:50:00) [16]

а чем стандартный TAnimate не подошел?
можно еще TrxGifAnimator из RxLib.


VadimSpb   (2006-08-07 18:31:00) [17]

По всякому пробовал - стопорится и все! Может это особенность компонента, который использую для его отображения.
Юзаю TGIFImage с http://www.tolderlund.eu/delphi/


Ega23   (2006-08-07 18:31:00) [18]

В отдельном потоке графику включай. Или запрос выполняй.


Desdechado   (2006-08-07 18:21:00) [19]

> особо нетерпеливым пользователям
бить по пальцам, непонятливых бить больно :)

гифку можно анимировать в отдельной нити


Наверх

Титульная страница Поиск, карта сайта Написать письмо