|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
В общем есть ADO Recordset возможно ли отменить его открытие когда уже вызван метод Open не дожидаясь когда рекордсет откроется??? В принципе догадаюсь, что решение связанно с многопоточностью, запускать выполнение запроса в отдельный поток, а затем при необходимости убивать его Но тогда у меня возникает другой вопрос, как организовывается многопоточность? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:12 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
Тебе поможет асинхронное выполнение запроса. У Open есть соответствующий параметр. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:23 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
Shocker.Pro, ок спс сейчас посмотрю ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:26 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
Shocker.Pro, Так нашел параметр – adAsyncExecute (он?) State – помогает узнать, отработан ли запрос Ну а как прервать выполнение запроса или он в любом случаи отработает до конца, но потихому типо незаметно? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:47 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
.Cancel ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:50 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
А Семен Семенович спасибо! Shocker.Pro огромное спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:52 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
TpaBkaНу а как прервать выполнение запроса или он в любом случаи отработает до конца, но потихому типо незаметно?Это зависит от сервера и интерфейсного драйвера. Не все сервера умеют прерывать выполнение запроса в принципе. Если сервер имеет команду "отменить запрос" она не всегда является реальной отменой. Я встречал сервера которым проще закончить обработку запроса и просто забыть результат чем отменять обработку запроса на середине. Кроме собственно серверных вариаций свои пять копеек может вносить интерфейсный драйвер. Там вообще может быть что угодно, от полного игнорирования команды на отмену, до физического обрыва соединения с сервером и создания нового коннекта. В общем, универсального ответа на вопрос "как делается отмена запроса" просто не существует. Надо смотреть на сервер и драйвера (версию драйверов!). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 18:22 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
Да, я тоже сталкивался. Скажем так. Можно отправить .Cancel в рекордсет и забыть о нем, а для открытия следующего рекордсета не использовать эту переменную, а инициализировать другую. Тогда рекордсет, даже если он не отменится, будет в фоновом режиме выполняться. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 19:35 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
В конце дня обратил внимание на такую вещь Вообще мне нужно открывать не 1 рекодсет асинхронно, а 4 Значит, открываю последовательно в одной процедуре 4 рекодсета, причем для их открытия существуют свои функция по концепции эти функции одинаковые, но туда передаются разные условия для запроса, все рекорсеты открываются с параметром adAsyncExecute Коннект на клиенте Первые 2 функции отрабатываются мгновенно 3-я задумывается на 30-120 сек 4 опять мгновенно. Почему? Б.Д.-Access Provider=Microsoft.Jet.OLEDB.4.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 23:39 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
Что ты подразумеваешь под "отрабатывается". Время чисто на Open или время от Open до того, как рекордсет отрапортует о завершении выполнения запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 23:54 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
[quot Shocker.Pro]Что ты подразумеваешь под "отрабатывается". Время чисто на Open или время от Open до того, как рекордсет отрапортует о завершении выполнения запроса?[/quot В том смысле что есть 4-е функции они идут в процедуре Command_Click ФункцияОткрытьРекорсет1 - здесь отрабатывается мгновенно ФункцияОткрытьРекорсет2 - здесь отрабатывается мгновенно ФункцияОткрытьРекорсет3 - вот здесь прогграмма зависает ФункцияОткрытьРекорсет4 1 и 2 рекордсет еще не открыты, они открываются асинхронно впрочем как и 3 и 4 но на 3-ей функции комп почему-то задумывается Функции идентичны по структуре ] ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 00:05 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
TpaBkaShocker.ProЧто ты подразумеваешь под "отрабатывается". Время чисто на Open или время от Open до того, как рекордсет отрапортует о завершении выполнения запроса?1 и 2 рекордсет еще не открыты, они открываются асинхронно впрочем как и 3 и 4 но на 3-ей функции комп почему-то задумываетсяТы не понял вопроса. Или я не понял ответа :) Показываю на пальцах: Допустим у тебя есть код с такой структурой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В этом случае, все хорошо и задержки выполнения (если они есть) будут по причине СУБД, надо будет смотреть текст хранимых процедур. А если у тебя код типа такого: Код: vbnet 1. 2. 3. 4.
А потом ты в цикле пытаешься ждать окончания всех четырех хранимок разом, то совершенно не важно какой там код внутри хранимых процедур. Ты упираешься в простую проблему: сервер не может выполнять несколько запросов одновременно от одного клиента . У тебя первый запрос уходит нормально, а второй (и последующие) либо А) падают с ошибкой "неправильнй порядок команд" которую ты игнорируешь, либо Б) драйвер неявно создает новые коннекты к базе и запускет все запросы в новом коннекте (а это выделение ресурсов на клиенте, на сервере, потеря на сетевое общение и тд), либо В) принудительно переводит тебя в синхронный режим (ждет окончания предудыщей команды, прежде чем послать следующую). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 01:05 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
White Owl Код: vbnet 1. 2. 3. 4.
У меня вот этот вариант Код: vbnet 1. 2.
Кстати сначала тоже последовательно открывал рекордсеты и ожидал открытия каждого через цикл, ну как у тебя White Owl только там еще в цикле проверялась переменная которая отвечает за отмену открытия рекордсета ну и последующий выход из процедуры Но в итоге прога падала из за DoEvents без ошибок просто зависала и затем её винда закрывала Сейчас еще раз все проверил, немного подшаманил с кодом и выходит что: Код: vbnet 1. 2. 3. 4.
Проверял на 1,5 млн записей то есть запросы были без условий (бд находится у меня на компе) так вот на открытие (то есть =adStateOpen ) всех 4 рекордсетов требуется около 40-60сек То есть вроде все хорошо но вот на кнопку отмена нормально не получается нажать как раз из-за Код: vbnet 1.
Просто здесь прога зависает и если кликать на кнопку отмена ноут начинает недовольн жужжать И в итоге отменяет не сразу а через сек 10-15 но это все происходит когда в выборке больше 300 тыс. записей на маленьком количестве записей все ок ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 10:44 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
White Owl, Спасибо я тебя услышал Открываю рекордсеты асинхронно последовательно (у тебя 1 вариант), но вместо цикла для проверки состояния рекордсета использую процедуру в таймере с интервалом 500 Работает идеально! От цикла пришлось отказаться, как я писал выше из-за DoEvents (прога падает) А без DoEvents не обойтись, так как отмену нельзя передать в процедуру ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 12:34 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
Да кстати вы правы тоже заметил, что Cancel срабатывает не мгновенно, а чем больше записей, тем дольше происходит отмена Например отмена выборки на 1,5 млн записей (Б.Д. на сервере) происходит около 7 сек ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 13:01 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
TpaBkaА без DoEvents не обойтись, так как отмену нельзя передать в процедуру Да и незачем это. Можно изменить глобальную переменную, а в процедуре ее проверить. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 13:07 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
TpaBkaа чем больше записей, тем дольше происходит отмена Например отмена выборки на 1,5 млн записей (Б.Д. на сервере) происходит около 7 секразумеется, так как откатывается транзакция. Я как-то сдуру запустил большой запрос на обновление на sql-сервере, когда через три часа я понял, что конца и края процессу нет - нажал отмену - так он еще три часа откатывался. Что касается запросов на выборку, да еще и в Аксесс - тут не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 13:15 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
AntonariyTpaBkaА без DoEvents не обойтись, так как отмену нельзя передать в процедуру Да и незачем это. Можно изменить глобальную переменную, а в процедуре ее проверить. Ну да я так и делаю Вот допустим есть цикл: Код: vbnet 1. 2. 3. 4. 5.
Цикл не даст нажать пользователю на кнопку и изменить BoolCancel = True если не будет DoEvents ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 14:03 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
А зачем этот цикл, если запрос асинхронный? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 14:27 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
AntonariyА зачем этот цикл, если запрос асинхронный?дадада, я тут отвлекся от топика. можно просто ловить событие окончания исполнения запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 14:33 |
|
Прервать выполнение запроса
|
|||
---|---|---|---|
#18+
) так топик был создан чтобы узнать как отменить запрос до окончания его выполнения ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 14:42 |
|
|
start [/forum/topic.php?fid=60&msg=37752540&tid=2157898]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 321ms |
total: | 481ms |
0 / 0 |