![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Индикатор при выполнении запроса
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]> особо нетерпеливым пользователям
бить по пальцам, непонятливых бить больно :)
гифку можно анимировать в отдельной нити