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

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

Асинхронное выполнение [D6, D7, MSSQL]


Страницы:   1 2

DPetrovich ©   (2002-12-25 15:57:00) 

Ситуация такая - есть связка ADOConnection->ADOQuery->DataSource->DBGrid
Ставлю в ADOQuery.ExecuteOptions=[eoAsyncExecute], но после ADOQuery.Open получаю ошибку "Access violation at address..."
Интеречно, что если не передавать данные в DBGrid, то ошибки не возникает. В чем проблема? И ещё вопросик - как определить что асинхронное выполнение запроса завершено? Заранне благодарю.


sniknik   (2002-12-26 19:01:00) [1]

Памяти не хватает наверное. А если просто открыть? без асинхронных наворотов, запрос - подождал пока загрузится и тогда по гриду лазить? также тормозит?
1.000.000 в грид это не совсем правильно, для того и SQL чтобы только актуальные данные смотреть/работать. а столько никто не с состоянии осмыслить.
Почему нереально реально (только трудновато), как я я себе мыслю, в таблицу поле добавить автоикремент и загружать порциями типа SELECT * FROM .... WHERE ID BETWEEN 1 AND 100
и т.д. при подходе к концу/началу порции догружать
SELECT * FROM .... WHERE ID BETWEEN 80 AND 180
(в другой датасет) и подменять их в ответственный период. Но чтобы юзер этого не заметил надо так датасетами жонглировать.... и естественно избыточность (данных больше) сеть перегружаеш одна надежда что юзер не 3 странице все бросит. Вот так примерно. А вот если каким параметром такое сделать попроще то такого не бывает по моему.
Лутще запрос с условиями пожостче и давать только нужные данные.


DPetrovich   (2002-12-26 17:59:00) [2]

sniknik, изменение CursorLocation не помогает.
Проблема ещё в том, что при eoAsyncFetchNonBlocking прога хоть и не подвисает сразу, но потом когда данные поступают все (а их > 1.000.000) начинает тормозить. Хотелось бы чтобы данные не все грузились сразу, а по мере движения в DBGrid"е ... или это не реально?


sniknik   (2002-12-26 12:03:00) [3]

DPetrovich © (26.12.02 11:36)
> может ты ещё какие-нибудь параметры ставил
да вроде нет особо не менял, может CursorLocation влияет (логически подумать то возможно) у меня у DataSet он clUseClient, у ADOConnection clUseServer.

> становится сразу dsBrowse
правильно сразу после первых полученных записей (очень быстро), и продолжение загрузки в фоне. поэтому и recordcount увеличивается.

passm © (26.12.02 11:49)
понять несложно, ты каждый день такое делаеш, просматриваеш интернет страници не дожидаясь конца загрузки? уже смотриш а она там еще пыжится банеры подгружает (и все с одного запроса). полный аналог.


passm   (2002-12-26 11:49:00) [4]

sniknik © (26.12.02 11:36)> Было неправильное понимание а это поможет порционно вытягивать ?:)


DPetrovich   (2002-12-26 11:47:00) [5]

кстати, при eoAsyncFetch почему то тоже ADOQuey.State становится сразу dsBrowse, поэтому и зависает после EnableControls


DPetrovich   (2002-12-26 11:36:00) [6]

У меня с eoAsyncFetch не получается порционно, а с eoAsyncFetchNonBlocking получается, но как-то странно,
ADOQuey.State становится сразу dsBrowse и поэтому ProgressBar не отрабатывает...
но записи действительно постепенно грузятся,
просто я сначала посмотрел ADOQuery.recordcount и удивился, что их мало, но потом выяснил что это значение со временем меняется!
И всё же интересно как у тебя без eoAsyncFetchNonBlocking получилось, может ты ещё какие-нибудь параметры ставил?


sniknik   (2002-12-26 11:36:00) [7]

passm © (26.12.02 11:11)
и тем не менее.

может неправильное понимание принципов?. :-))

с eoAsyncFetch запрос выполняется 1 раз (не нарушая принципов клиент/сервер) но асинхронно в паралельном потоке не тормозя основной, а вот полученные данные отдаются по мере поступления. где нарушение?
никто же не делает запросов
SELECT TOP 30 ....
SELECT NEXT TOP 30 ....
и т.д.


passm   (2002-12-26 11:11:00) [8]

Вытягивание данных с сервера порционно ИМХО проблематично (невозможно) исходя из принципов клиент/сервер.


sniknik   (2002-12-25 18:44:00) [9]

делаю так
ADOQuery.ExecuteOptions=[eoAsyncFetch]

но и оба [eoAsyncExecute,eoAsyncFetch] тоже работают разница небольшая получается.
(вообщето с ADODataSet просто отвечал сбился почемуто, квери и тайбл использую только в тестах)

случайно подозрение не на первые записи? (что не грузятся) подожди чуток они появятся, и не доверяй скролу, клавишами вверх иди.


DPetrovich   (2002-12-25 18:32:00) [10]

у меня подозрение, вернее даже уверенность, что если eoAsyncFetchNonBlocking, то он не все записи грузит...
Ещё раз скажи, плиз, как ты делаешь, ADOQuery.ExecuteOptions=[eoAsyncFetch] или [eoAsyncExecute,eoAsyncFetch] ?


sniknik   (2002-12-25 18:01:00) [11]

остальное также с циклом. у меня работает.

помогло, работает? значит больше не трогай! ничего не меняй. :-)


DPetrovich   (2002-12-25 17:48:00) [12]

зато
eoAsyncFetchNonBlocking помогло


DPetrovich   (2002-12-25 17:26:00) [13]

не помогает :(
всё остальное также оставить?


sniknik   (2002-12-25 17:20:00) [14]

ADOQuery.CacheSize:= 30;


sniknik   (2002-12-25 17:19:00) [15]

CacheSize:= 30; //примерно сколько в гриде строк //одномоментный показ
и
ADOQuery.ExecuteOptions=[eoAsyncFetch];


passm   (2002-12-25 16:56:00) [16]

DPetrovich © (25.12.02 16:48)> ИМХО не поможет.


DPetrovich   (2002-12-25 16:48:00) [17]

sniknik, спасибо!!!
А как бы ещё сделать чтобы данные не целиком выплёскивались, а порционно?
passm, а это поможет порционно вытягивать ?


passm   (2002-12-25 16:39:00) [18]

DPetrovich © (25.12.02 16:31)> Создать поток со свойством DataSet: TDataSet
procedure TThread.Execute;
begin
Synchronize(FDataSet.DisableControls);
try
FDataSet.Open
except
on E: Exception do
...
end;
Synchronize(FDataSet.EnableControls)
end;


DPetrovich   (2002-12-25 16:31:00) [19]

ну это типа специальная фича для выполнения запроса асинхронно ... а как подругом? через TThread?


sniknik   (2002-12-25 16:31:00) [20]

zx © (25.12.02 16:28)
полезно чтобы не тормозило.


Страницы:   1 2

Наверх

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