|
|
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
А началось это здесь: Как избавиться от подтверждений на удаление и т.п., или что лучше DoCmd.Run (C) Sfagnum & Co.\r \r С одной стороны я часто встречал мнение неискушенных разработчиков (к каковым и отношусь сам), что выполнение запросов в асинхронном режиме волшебным образом увеличивает скорость выполнения программы в целом. Это ерунда. За мотивацией с моей стороны обращайтесь в указанное выше место, т.е. туда, откуда это всё началось :)\r \r С другой стороны, встречаю мнения продвинутых (в уважительном, хорошем смысле слова) разработчиков, исповедующих только синхронные режимы (утрирую).\r \r Сам долгое время считал асинхронные запросы аля "от лукавого", но узнав, что с самого начала разработки в Access я пользуюсь именно такого рода режимом выполнения запросов при открытии форм, стал относиться к этому чуду с меньшим страхом :) и с большим интересом. Опустим рассмотрение всех прелестей выполнения запросов в асинхронном режиме при открытии форм (ибо это стандартное, встроенное средство), а обратимся непосредственно к теме: \r \r "Сознательное (!) использование асинхронных запросов"\r \r 1) С отображением данных вроде как всё ясно - асинхронный режим оправдан.\r \r 2) А что на счет выполнения исполняемых (не селектов) запросов?\r Смоделируем ситуацию... Сразу оговорюсь, что некоторые пункты избыточны, но в данном случае чем их (пунктов) больше, тем более понятна идея.\r \r На основе введенной Оператором приходной накладной должны быть выполнены следующие бизнес-транзакции:\r а) Приходная накладная должна быть сохранена как документ;\r б) Позиции в накладной должны быть сохранены как "расшифровка" суммы по документу;\r в) Сама сумма должна быть учтена в соответствующих бухгалтерских проводках;\r г) Должно быть пересчитано сальдо по взаиморассчетам с данным поставщиком;\r д) товар должен быть распределен в соответствующие секции Склада;\r е) товар должен быть распределен по логическим партиям, например по сроку годности (скажем товар относительно скоропортящийся и требует очень жесткого управления запасами - если годность поступившего товара исткает раньше, чем годность остатков этого же самого товара, то во-первых отделу закупок по шапке, а во-вторых надо сначала продавать именно новую партию, а уже затем остатки);\r ж) автоматически сформировать Отпускные накладные по товару, закупленному "под заказ", т.е. по транзитному товару;\r з) сформировать Отборные листы для склада (с указанием секций склада и логических партий товара) на основе Отпускных накладных;\r и) уведомить какой-нибудь отдел о данном событии...\r к) ну пожалуй и хватит!\r \r Предположим, что фирма большая и, соответственно, объемы данных огромны, а вот реализовано всё на... Аксе :) Пусть будет так!\r В связи с выше сказанным, предположим, что выполнение всех этих действий займет 2 минуты +/- еще 10 минут :)\r Еще одно немаловажное, а вернее САМОЕ ВАЖНОЕ допущение - Оператор занят только оприходованием накладных и, таким образом, не использует результаты своего труда - все те данные, которые были им введены не учавствуют в его дальнейших действиях.\r \r Ну и если это всё реализовать СИНХРОННО, то оператор после введения накладной может попить кофе, покурить и пойти погулять, а на все притензии своего начальства ткнуть в вас (программера) пальцем и сказать, что это система виновата, что работа не сделана! Что он, дескать, вынужден тупо чего-то ждать и ну не как не может начать оприходование следующей накладной, пока красная (зеленая/фиолетовая) "лампочка" на системном блоке "мигает". Кстати, это абсолютно реальная ситуация. Более того, я был "внутри" данной ситуации! Правда, не в качестве программера, но это не меняет суть - у работников появляется классная отмазка, а у тех, кто действительно работает, появляется раздраженность на тормоза.\r \r Реализуем эту же задачу АСИНХРОННО. Млин... Сказка какая-то! Не успел Оператор нажать соответствующую кнопочку, как документик закрылся (после небольшой задержки, связанной с некими внутренними подготовительными манипуляциями) и уже может начинать вбивать следующий документ! \r Как же реализована эта "сказка"? Во как...\r Создаем Класс (только в модулях класса можно использовать WithEvents) "ОприходованиеНакладных". Создаем некое ядро (в терминологии ЛП) или попросту "шагалку" (принцип описан в FAQ Сжатие БД, пункт 6.4) в которой в последовательном порядке выполняем необходимые действия, ключевыми из которых являются исполняемые запросы, запускаемые в асинхронном режиме. "Шагалка" переходит на следующий этап выполнения Оприходования накладной по соответствующему событию завершения выполнения асинхронного запроса. Т.е. мы создали... МНОГОЗАДАЧНОСТЬ! :) Код, обслуживающий Юзера крутится отдельно, а наш отдельный "поток" вызывается событиями завершающихся асинхронных запросов, в результате запускается очередной запрос и опять ожидается (без малейшего расхода машинного времени) его завершение! Ну точно отдельный поток получили!\r \r Косяк, конечно, есть и здесь - время оприходования накладной будет зависить от скорости работы Оператора, т.е. сам запрос будет выполняться по большей части только в моменты, когда Юзер "не шлет системе сообщений", т.е. не топчет клавиатуру и не катает мышку. В перерывах, так сказать... Т.е. в конечном счете выполняться это будет 10 минут +- еще 20! Для Оператора эта схема хороша, а вот для фирмы в целом - х.з., зависит от скорости проистекающих на фирме процессов.\r Но всё равно, в этой идее что-то есть! То ли от "лукавого", то ли от... Хорошего, вообщем :)\r \r Что думаете, уважаемые, по поводу СОЗНАТЕЛЬНОГО использования асинхронных запросов в целом и о выше сказанном в частности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 17:29 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Нуф-Нуф, да ты поэт, млин! Что не топик, так целый трактат на тему. :) Вообще, вся эта многозадачность, по-моему, нужна для того, чтобы программист мог, пока пользователь думает (ищет кнопку на клавиатуре, клавиатуру, мышь, компьютер или свои мысли), программист в лице написанной им программы, мог сделать свои неотложные дела. В случае с открытием форм - форма прочитала одну запись, открылась, показав ее, и, пока юзер ищет мышку, ведет ее, скажем, к (*) для ввода новой записи, форма получила все остальные, и готова работать. Слегка утрированно, но смысл понятен. Простейший пример "многозадачности" - вешаем на форму достаточно часто вызываемый таймер, по которому выполняется ма-аленький кусочек большой задачи. Если программа "занята" - таймер не вызовется. Если пользователь быстро (достаточно быстро, чтобы не давать программе "очухаться") пихает фишки - таймер не вызовется. Если же у него зачесалась нога промеж лопаток, то, пока он решает эти бытовые проблемы, таймер успеет отработаться n раз, и посчитает m% от нашей задачи. И некий отчет, требующей длительной подготовки и расчетов, откроется "мухой", а не даст скучающему оператору возможность попить чаю. Так, чем придумывать какие-то "таймеры", почему бы, например, при входе в программу не запустить расчет остатков товаров на начало дня и, пока пользователь дойдет до места, в котором они ему потребуются, расчет будет уже выполнен. Т.е. асинхронные запросы не вредны (как, впрочем, и не необходимы), они просто есть. А могли бы и не быть. Как могло бы и не быть, например, функции MsgBox - ну написал бы ты ей замену, если б не смог обойтись без нее. Вот :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 17:46 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Между прочим, некоторые недостатки асинхронного запроса улетучиваются, если он исполняется на сервере (не путать с исполняется на пианино). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 18:45 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Свидетель Geo, ваши показания приняты, но не поняты :) Так в своем (обвинительном или оправдательном?:) повествовании вы сказали: >таймер успеет отработаться n раз, и посчитает m% от нашей задачи. И некий отчет, требующей длительной подготовки и расчетов, откроется "мухой" Соглашусь, но это касается только (!) случаев программной обработки некой задачи, а если же для выполнения данной задачи необходимо выполнить запрос, который отрабатывает секунд за 10? И таких запросов штук 10? Ну тока не надо говорить о неправильно выбранной среде разработки или структуре данных! Это ж просто размышления :) В этом случае выполнить запрос "кусочками", пока пользователь чешет промеж лопаток :), может только сама система! Да, по таймеру запустится запрос, но если он будет запущен в синхронном режиме, то пока не отработает фик пользователь увидит эхо от своих действий. Единственный выход организации "параллельной" работы кода и запроса – асинхронное выполнение последнего. Именно поэтому ваши показания: "Т.е. асинхронные запросы не вредны (как, впрочем, и не необходимы), они просто есть. А могли бы и не быть." не принимаются к рассмотрению и будут вычеркнуты из протокола Асинхронные исполняемые (не селекты) запросы однозначно нужны. Нужны они в одном-единственном случае – когда коду, который его запускает, не нужны результаты выполнения данного запроса. На счет асинхронных "селектов" и так всё ясно :) Тем не менее, вариант "таймерной многозадачности" принимается как механизм создания сверх-виртуальной многозадачности при решении задач средствами кода (не запросов). Спасибо! > Так, чем придумывать какие-то "таймеры", почему бы… Чё та я торможу :( В описанной мной гипотетической задаче разве можно что-либо сделать в момент открытия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 18:52 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Нда... Саныч, сервер... Клиент-сервер... Мне об этом мечтать тока остается :( или второй комп покупать :) //не хочет ставить локальный сервак, хотя надобы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 18:56 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
ключевая фраза Асинхронные исполняемые (не селекты) запросы однозначно нужны. Нужны они в одном-единственном случае – когда коду, который его запускает, не нужны результаты выполнения данного запроса остается только однозначно знать когда выполнение происходит асинхронно или синхронно по умолчанию - это не всегда очевидно - Сам долгое время считал асинхронные запросы аля "от лукавого", но узнав, что с самого начала разработки в Access я пользуюсь именно такого рода режимом выполнения запросов при открытии форм и определиться какой вариант будет оптимальнее - это уже из опыта. всё эт о очень ценно, но Саныч прав - наступает время ADP . мое мнение - даже настольное приложение надо делать на ADP + MSDE. MSDE можно в дальнейшем менять смело на SQL типа сервер. и снхронность / асинхронность необходимо рассматривать уже несколько по другому. как настояющую асинхронность - 2 или более процессора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 19:10 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
не принимаются к рассмотрению и будут вычеркнуты из протокола \r Не очень-то и хотелось \r \r Нужны они в одном-единственном случае – когда коду, который его запускает, не нужны результаты выполнения данного запроса. \r \r Или когда этому коду есть еще чем заняться, а запросы выполняются на другом компьютере\r \r Я придерживаюсь критерия что большинство рутинной работы должен делать компютер, в том числе и при написании програм. Для меня програмирование сначала часть бизнеса а потом искуство.\r С точки зрения бизнеса надо написать в кратчайший срок действуюшее приложение, с точки зрения искуства - что на это все и еще было приятно посмотреть. Поэтому я редко переписываю то что работает, но писать всегда надо лучше чем вчера. \r (с) /topic/39 , 24 авг 01, 10:25 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 19:14 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
2НУФ-НУФ АДП хорошо идет с MSDE. я для проверки поставил на втором диске сервер2000 и SQL2000 (с С: загружается ХРпро) это только для проверки работы с серваком , а разработка в ХР / А2002 . для отладки - великолепно . на работе под ХР стоит MSDE на другом компе (под 98 тоже катит) и работа почти как с серваком. пробуй понравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 19:17 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Нужны они в одном-единственном случае – когда коду, который его запускает, не нужны результаты выполнения данного запроса И, если запрос выполняется здесь же, на этом же компьютере, и здесь же лежат данные (не надо дожитаться, пока они доползут по сетке) - наоборот, важно, чтобы коду больше нечего было делать, иначе выползет 11-я секунда :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 19:20 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Ну, вобщем-то, решение суда в отношении асинхронных запросов в mdb и еже с ним технологий (настольная и файл-серверная БД) однозначно: 1) Асинхронное выполнение селектов есть хорошо. 2) Асинхронное выполнение исполняемых запросов оправданно в случаях, когда коду, который его запускает, не нужны результаты выполнения данного запроса. 3) В многоПРОЦЕССОРНЫХ системах. Решение может быть обжаловано :) В отношении клиент-серверных технологий... Показания свидетелей были однозначны: Владимир Саныч: >Между прочим, некоторые недостатки асинхронного запроса улетучиваются, если он исполняется на сервере Вадя: >и снхронность / асинхронность необходимо рассматривать уже несколько по другому. как настояющую асинхронность - 2 или более процессора (в контексте клиент-серверной технологии) Geo: >Или когда этому коду есть еще чем заняться, а запросы выполняются на другом компьютере Оправдан! (ДЫМЦ) //удар молотка ...или как там эта штука называется? ================================== Вадя, знаю... Надо, давно надо переходить на ADP, но... Вообщем когда-нибудь я обязательно так и сделаю! Надеюсь в течении годика... Geo, не, твое: >И, если запрос выполняется здесь же, на этом же компьютере, и здесь же лежат данные (не надо дожитаться, пока они доползут по сетке) - наоборот, важно, чтобы коду больше нечего было делать, иначе выползет 11-я секунда :) не катит :)~ Я тут тестировал кое-что и специально создал табличку на 2,500,000 записей. Так знаешь чего? Локально она у меня прогружалась (полностью) порядка 50 секунд! Комп, конечно, тормознутый, но такие запросы только в асинхронном режиме, имхо, если конечно удовлетворены требования данного суда :) См. начало этого поста... з.ы. можно конечно порассуждать на тему выполнения асинхронных запросов в клиент-серверных технологиях, но здесь я могу быть тока читателем. Так что сорри... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 20:11 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Нуф, что-то ты меня запутал малость... Вот, захотелось самому попробовать: Табличка с 2,3 млн. записей из текстового и 2-х числовых полей, из которых 1/6 содержит строку "Иванов". 2 процедурки: №1 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. №2 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Все живет в одной mdb'шке... В итоге я получил такие результаты: Код: plaintext 1. 2. 3. 4. 5. Где же "11-я секунда"? Я тебе ответственно заявляю - в моей машинке 1 процессор Athlon 1333. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 23:13 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
приду завтра буду фосфорецировать если не забуду марос марроооооссс ниии мааарроссь .... (удаляясь и позвякивая пластиковой бутылью) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 23:37 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Ой бля я прям сегодня пришел (во как бывает) Гео, не в обиду тебе будет сказано, но "dbRunAsync Runs an asynchronous query ( ODBCDirect workspaces only )." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 23:45 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
2ЛП Да видел я это... Это не единственные функции, которыми я изголялся, но даже из них видно, что CurrentDb.OpenRecordet без этого аргумента работает асинхронно, до тех пор, пока не начнешь обращаться еще к неподготовленным записям рекордсета. А-ля форма, которая показала первую запись, еще не дождавшись последней... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2003, 23:53 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Это не единственные функции, которыми я изголялся, но даже из них видно, что CurrentDb.OpenRecordet без этого аргумента работает асинхронно Здрасте на куй я ваша дядя Оно усегда работало синхронно. У меня. Потому как ODBCDirect'ом я не пользуюсь. Ты случаем не путаешь асинхронное выполнение с режимом dbOpenDynaset (Keyset в ADO)???? Там тоже сначала подчитываются ключи, а уж только по мере необходимости сами данные. Так что получается, что запрос отработал, а данные все еще не пришли (и, возможно, не придут никогда) Еще примеры не единственных функций можешь привести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 00:02 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Ты случаем не путаешь асинхронное выполнение с режимом dbOpenDynaset (Keyset в ADO)???? Там тоже сначала подчитываются ключи, а уж только по мере необходимости сами данные. Так что получается, что запрос отработал, а данные все еще не пришли (и, возможно, не придут никогда) Скорее всего, путаю... А функции я кроме этих двух поубывал уже все. Да, оказвается, они и не нужны... Так. Буду пробовать ишо. Завтра. Эх, дароги... (пока тихонько) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 00:13 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Geo, миль пардон, а что это за For t = 1 To 100000000? И почему время исполнения этого цикла ты считаешь частью времени исполнения запроса? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Это будет время выполнения команды a = 1??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 00:34 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Этот цикл, по-моему, в одном случае, должен был выполняться параллельно запросу, а в другом - после запроса. Но сейчас я, пожалуй, вообще ничего не понимаю. Смилуйтесь, други, объясните, что я сделал и что получил, а то я спать буду плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 00:41 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Марос марос но Хочешь замерить время открытия рекордсета (в разных условиях) - делай Код: plaintext 1. 2. Причем лучше цикл поменьше, а рекордсет покруче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 00:50 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Ок. Попробоваю. Но в этом случае я запущу несколько запросов, обращающихся к одним и тем же записям параллельно/непараллельно друг к другу. А я хочу совместно/последовательно с запросом запустить запустить какое-нибудь постороннее действие, и посмотреть, как это в Акцесе отработается... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 00:56 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
По-моему, в цикле "Последовательно" ты меряешь время запроса + время цикла, а в цикле "Параллельно" просто время цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 01:02 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
В "последовательно" я меряю время запроса + время цикла, а в "параллельно" - время более длинного из них. Судя по словам Нуфа, во случае с "параллельно" они должны были мешать друг другу настолько, что время выполнения стало бы превышать совокупное время последовательного выполнения. А ЛП сказал, что я измерял то, не знаю что. И я склонен ему верить. Или не верить. Ну вот, я опять запутался... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 01:10 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Гео, не, это я плохо спать буду :) В смысле мало, но рассказать ближнему то, что сам знаешь – дело хорошее, ибо откликнется тем же (надеюсь)… Итак… Во-первых… >Set rs = CurrentDb.OpenRecordset("Select * from t where t.fio=""Иванов"";", , dbRunAsync) >' На самом деле последний аргумент не нужен и мотивация: >CurrentDb.OpenRecordet без этого аргумента работает асинхронно, до тех пор, пока не начнешь обращаться еще к неподготовленным записям рекордсета. А-ля форма, которая показала первую запись, еще не дождавшись последней... Здрасте на куй я ваша дядя (C) ЛП По умолчанию все запросы и при запуске из любой библиотеки (дао/адо/акссес(ДуЦМД)) выполняются синхронно. "А-ля форма, которая показала первую запись, еще не дождавшись последней" реализована не через асинхронное выполнение. Т.е. открытие рекордсета из кода с умолчательными параметрами не есть открытие рекордсета формой с прописанными параметрами асинхронного режима. Более того, часть запроса запущенного формой выполняется в синхронном режиме, а часть в асинхронном. Эдо дело рулится параметрами, грубо говоря, AsyncExecute, FetchCacheSize и AsyncFetch. "Грубо говоря" потому что в каждой библиотеке названия свои… AsyncExecute отвечает за то, что запрос должен выполняться асинхронно; AsyncFetch говорит что часть запроса должна быть выполнена синхронно, а оставшаяся часть – асинхронно; ну и FetchCacheSize характеризует какое количество записей должно быть возвращено запросом в синхронном режиме, при этом все остальные записи возвращаются уже в асинхронном. Так вот формы при открытии указывают следующие параметры: AsyncExecute = True, FetchCacheSize = 500 и AsyncFetch = True. В результате мы видим, что в момент возникновения OnOpen формы (самое первое событие) рекордсет содержит 501 запись (количество возвращенных записей в синхронном режиме). Все остальные записи будут возвращаться в асинхронном, а значит в момент, когда более приоритетные потоки (в нашем случае поток, выполняющий VBA код) простаивают. Желаешь убедиться? Сделай так: 1) Создай ленточную форму на основе длинющей-длинющей таблички; 2) в заголовке формы создай текстовое (свободное) поле; 3) установи таймер в одну секунду 4) по таймеру пихай в текстовое поле количество записей в рекордсете, подключенном в форме; 5) убедись, что загрузка записей производится… А теперь пункты 1 и 2 те же, а вот остальные следующие: 3) установи таймер в 1 мс; 4) в процедуре таймера запусти бесконечный цикл (Do … Loop без параметров) внутри которого читай количество записей в рекордсете и выводи в текст бокс. Убедись, что загрузка записей НЕ производится… И в том и в другом варианте на всякий случай делай репаинт... На счет твоего теста… Вот не знаю как там DAO обходится с асинхронностью (но точно по умолчанию режим синхронный), но вот как ADO обходится – знаю, поэтому буду судить о твоем тесте по "правилам" ADO. Выполнение "Последовательно" – ну здесь всё просто. Выполнение "Параллельно" – всё не так! Даже если ЛП не прав на счет асинхронности только для ОдиБиСи и предположим, что запрос выполнялся всё ж таки асинхронно, то вот что произошло: Код: plaintext 1. 2. 3. 4. 5. 6. Кстати, если будешь выполнять описанный мной тест с формами, то проделай следующее – открой сразу две копии одного и того же мдбэшки, расположи рядом (чтобы было видно и то и другое), запусти 1-й вариант теста и попереключайся между этими задачами. О результатах расскажешь :) Ну как мог… з.ы. щаз увидел продолжение дискуссии, но уже завтра... усе завтра... в смысле сегодня, но завтра :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 01:59 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Поправочка... Начиная с "Здрасте на куй я ваша дядя (C) ЛП " По умолчанию все запросы и при запуске из любой библиотеки (дао/адо/акссес(ДуЦМД)) выполняются синхронно. "А-ля форма, которая показала первую запись, еще не дождавшись последней" реализована не - (лишнее, надо выкинуть!) через асинхронное выполнение. Т.е. открытие рекордсета из кода с умолчательными параметрами не есть открытие рекордсета формой с прописанными параметрами асинхронного режима. Конечный вариант правки: Здрасте на куй я ваша дядя (C) ЛП По умолчанию все запросы и при запуске из любой библиотеки (дао/адо/акссес(ДуЦМД)) выполняются синхронно. "А-ля форма, которая показала первую запись, еще не дождавшись последней" реализована через асинхронное выполнение . Т.е. открытие рекордсета из кода с умолчательными параметрами не есть открытие рекордсета формой с прописанными параметрами асинхронного режима. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 02:04 |
|
||
|
Встать! Суд (над асинхронными запросами) идет! :)
|
|||
|---|---|---|---|
|
#18+
Еще... На самом деле форма может возвращать в синхронном режиме либо все записи, либо 501, либо то количетсво записей, которое в данный момент может быть отображено на экране... Но это уже в следующий раз как-нибудь... Еще "еще"... В твоем тесте в цикл надо вставить отображение количества загруженых записей (хотя бы так, как это сделал я - через отображение в текстбоксе) и... убедиться, что в таком цикле нифига записи не будут грузиться, а если и будут, то только за счет жалости виндоус - поток с запросом попадет в статус "голодающих" и винда будет ему иногда подкидывать процессор. Дело изменится, если ты в цикл вставишь DoEvents, сознательно отказваясь в потоке VBA кода от выделенного кванта времени в пользу других. вот тогда ты увидишь реальную загрузку данных в асинхронном режиме, реальное поочередное выполнение потоков в многозадачной системе и вот именно здесь ты и получишь результаты замера по времени с 11-ой секундой! :) Всё! Спать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2003, 02:15 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32264415&tid=1679374]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 306ms |

| 0 / 0 |
