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

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

ADOQuery и TThread


Беликов А.А, ©   (2010-04-07 20:05:00) 

Хочу реализовать открытие датасета в отдельном потоке.
Делаю связку ADOConnection + ADOQuery + DataSource + DBGrid.
ADOQuery.Open запускаю в отдельном потоке.
На тестовом примере ошибок не обнаружено.

Какие могут возникнуть проблемы?


Демо   (2010-04-09 11:30:00) [1]


> Беликов А.А,   (07.04.10 20:05) 
> Хочу реализовать открытие датасета в отдельном потоке.Делаю
> связку ADOConnection + ADOQuery + DataSource + DBGrid.ADOQuery.
> Open запускаю в отдельном потоке.На тестовом примере ошибок
> не обнаружено.Какие могут возникнуть проблемы?


Судя по всему - тестовый пример был написан не корректно.

Проблемы возникнут с синхронизацией.

ADOConnection + ADOQuery создаются в отдельном потоке?

DataSource + DBGrid.ADOQuery - VCL-компоненты, для которых нужна синхронизация (что невозможно).


sniknik   (2010-04-08 11:04:00) [2]

> Может стОит просто запрос оптимизировать?
очевидные вещи приходят только с опытом... да и то не всем.

дайте человеку своих шишек понабивать, демонстрация чужих его не научит.


Sergey13   (2010-04-08 10:53:00) [3]

> [2] Беликов А.А,   (07.04.10 20:52)
> Идея в том, чтоб во время выполнения запроса можно было
> нормально перерисовывать окно и например показывать красивое
> анимированное окно шоб юзеру скушно не было.

Может стОит просто запрос оптимизировать?


Dennis I. Komarov   (2010-04-08 10:49:00) [4]


> Хотел получить нечто среднее, т.е. во время выполнения запроса
> юзер мог бы передвигать окно + анимированное окно, НО в
> то же время никаких записей в гриде.

Бросте заниматься бредом. Оно ни Вам, ни бедным пользователям не нужно...


sniknik   (2010-04-08 10:47:00) [5]

> А ты чего хочешь, что бы он на полпути бросил, мол дальше докачивайте ручками, носите в ведрах.
ну, клиентский рекордсет в похожем режиме именно так и делает... нужно вызывать функцию для получения следующей порции данных (т.е. получается ближе к чисто серверному курсору, но фетч порциями).

но тут не так, тут он просто не разобрался с управлением...


Anatoly Podgoretsky   (2010-04-08 10:14:00) [6]

> Беликов А.А  (08.04.2010 09:19:09)  [9]

А ты чего хочешь, что бы он на полпути бросил, мол дальше докачивайте ручками, носите в ведрах.


sniknik   (2010-04-08 09:35:00) [7]

> Засада в том, что eoAsyncFetch отпускает главный процесс только тогда, когда на стороне сервера набор получен полностью.
да ну, а зачем он тогда нужен?... режим повторяющий открытие с клиентским курсором. кто то ошибается, либо ты, либо мелкософт и его справка... (на кого ставим?)

> Хотел получить нечто среднее, т.е. во время выполнения запроса юзер мог бы передвигать окно + анимированное окно,
> НО в то же время никаких записей в гриде.
изучай дальше

> eoAsyncFetchNonBlocking + DBGrid.DataSource = nil - не вариант.
почему нет? хотя неважно, есть и другие способы добиться того же, и не один.


Беликов А.А   (2010-04-08 09:19:00) [8]

Вы наверно имеете ввиду eoAsyncFetch или eoAsyncFetchNonBlocking...

Засада в том, что eoAsyncFetch отпускает главный процесс только тогда, когда на стороне сервера набор получен полностью.

А в случае eoAsyncFetchNonBlocking набор получает записи, а грид сразу начинает их отрисовывать.

Хотел получить нечто среднее, т.е. во время выполнения запроса юзер мог бы передвигать окно + анимированное окно, НО в то же время никаких записей в гриде.

eoAsyncFetchNonBlocking + DBGrid.DataSource = nil - не вариант.

p.s. Сервер MSSQL


MsGuns   (2010-04-08 01:36:00) [9]

>Беликов А.А,   (07.04.10 20:52) [2]
>Если Сникник вы так не делаете, то у вас нет ответов, и тем не менее, у >кого был опыт - поделитесь

Сникник так не делает потому, что в этом нет никакой необходимости, т.к. само АДО использует потоки. Для Вашей задачи достаточно просто запускать запрос в асинхроноом режиме,- читайте справку по АДО, там все подробно написано.


Игорь Шевченко   (2010-04-07 23:24:00) [10]

Loginov Dmitry ©   (07.04.10 22:53) [6]

Свои


Loginov Dmitry   (2010-04-07 22:53:00) [11]


> Клиент Oracle, например, предоставляет thread-safe клиентскую
> модель исполнения паралелльных запросов с одним подключением.
>


А какие компоненты подключения используете для работы с Oracle?


Игорь Шевченко   (2010-04-07 22:47:00) [12]

Loginov Dmitry ©   (07.04.10 22:41) [4]

Это все зависит от возможностей базы данных и ХХХ. Клиент Oracle, например, предоставляет thread-safe клиентскую модель исполнения паралелльных запросов с одним подключением.


Loginov Dmitry   (2010-04-07 22:41:00) [13]


> На тестовом примере ошибок не обнаружено.
>


Значит еще возникнут. Насколько мне известно, компоненты TXXXConnection очень нежелательно использовать сразу в разных потоках. Одно подключение должно использоваться не более чем в одном потоке.


oldman   (2010-04-07 21:47:00) [14]


> ADOQuery.Open запускаю в отдельном потоке.


Почему именно Open?


Беликов А.А,   (2010-04-07 20:52:00) [15]

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

Если Сникник вы так не делаете, то у вас нет ответов, и тем не менее, у кого был опыт - поделитесь


sniknik   (2010-04-07 20:46:00) [16]

> Какие могут возникнуть проблемы?
разные... бессмысленные... никому не нужные... безответные... т.к. так не делают, а значит опыта их решения ни у кого нет.


Наверх

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