powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ворос к знатокам - возможно ли запустить асинхронно?
21 сообщений из 21, страница 1 из 1
Ворос к знатокам - возможно ли запустить асинхронно?
    #32025200
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть форма на ней ОЧЕНЬ много подчиненных которые желательно обновлять
но если запускать обновление всякий раз когда это нужно - получаются тормоза

возможно ли запустить асинхронно
object.requery
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32025506
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAO - не помню. ADO - программно открывай рекордсет обьявленный with events с опцией AsyncExecute+AsyncFetching, при первом событии Fetchprogress имеем готовый, но не до конца заполненный рекордсет, который уже можно подсунуть форме. Лучше всего создать класс в котором все это варится.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32025524
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил. В DAO никак.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32025537
Чумак А.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2SysOp
В Access 2000 (VBA), ADO 2.6 SP1 Fetchprogress не работает. Проверял. Много раз. На больших и маленьких наборах записей. С установкой .CursorLocation = adUseClient, .Properties("Initial Fetch Size"), .Properties("Background Fetch Size").
Я думаю - это проблема VBA. В обычном VB проблем нет. SysOp, ты сам это в Access 2000 (VBA) проверял? Или твой совет чисто теоретический?
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32025571
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ чисто практический. Не то что проверял, все это крутится почти 2 года. Завтра, если интересно, могу вывалить пример.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32025705
Чумак А.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2SysOp
Давай пример.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32025752
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Option Compare Database
Option Explicit
Private WithEvents rs As ADODB.Recordset

Private Sub Form_Open(Cancel As Integer)
Dim rs1 As ADODB.Recordset
Set rs1 = New ADODB.Recordset
rs1.ActiveConnection = CurrentProject.Connection
rs1.CursorLocation = adUseClient
rs1.CursorType = adOpenStatic
rs1.LockType = adLockOptimistic
rs1.Source = "Select * From dbo.Products"
rs1.Open , , , , adAsyncExecute + adAsyncFetch
Set rs = rs1
End Sub

Private Sub rs_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
Static sw As Boolean
If Not sw Then
Set Me.Recordset = rs
sw = True
End If
End Sub
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32026093
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело в том что в качестве источника записей испоьзуется XP с параметрами типа строка - а параметр почему то не хочет ничего воспринимать ничего кроме числового формата.

Но тем не менее удалось избежать тормозов при вводе-
в главную форму - секутндный таймер проверяющий состояние двух общих переменных(нисколько не замедляет) - одна что внесены изменения -вторая показатель активности - что пользователь активно вбивает данные и пока не смотрит на сумму. таймером каждый раз сбрасывается вторая переменная. когда пользователь перестает вдалбливать данные таймер обнаруживает нулевой показатель активности и выполняет необходимые процедуры обновления связанных форм
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32026110
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, нельзя сумму из под кнопки сделать?
насчет строкового парамтра - если правильно прописал строчку в InputParameters проблем быть не должно.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32027112
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для SysOp
Чем плох ваш вариант. Как правило, необходимость использовать асинхронный источник данных у формы возникает как следствие желания иметь возможность работать в приложении пока данные выбираются с сервера. То, что предложили вы работает следующим образом. Да, пока не приехала с сервера первая строчка данных асинхронного рекордсета работать в приложении можно. Но как только приезжает первая строчка и тут же рекордсет подсовывается форме, то в этот момент все дальнейшие действия в приложении будут блокированы до конца выборки данных асинхронным рекордсетом. Т.е. конечная цель не достигнута - в приложении по прежнему нельзя работать. Чтобы убедится в этом создайте такой источник данных, чтобы время от момента запроса к серверу до момента начала возврата на клиента первой строки набора исчислялось несколькими секундами, а время от момента начала возврата на клиента первой записи до момента окончания выборки исчислялось десятками секунд, именно так станет все очевидно.
Решение, позволяющее не блокировать действия в приложении я приводил тут:
http://am.rusimport.ru/MsAccess/Samples%5Cfrm000.htm

Повторю его здесь:

Option Compare Database
Option Explicit

Dim WithEvents rst As ADODB.Recordset
Dim blnФлаг As Boolean

Private Sub Form_Open(Cancel As Integer)
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM Таблица", CurrentProject.Connection, adOpenStatic, _
adLockOptimistic, adAsyncExecute
End Sub



Private Sub rst_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _
ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)
If blnФлаг = False And rst.state = adStateOpen Then
blnФлаг = True
Set Me.Форма2.Form.Recordset = rst
End If
End Sub

Да, в этом случае данные появятся в подчиненной форме только после того, как приедут все записи(собственно как и у вас, несмотря на более раннее подсовывание), но все это время действия пользователя не будут блокироватся Access, как в вашем варианте.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32027122
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что ADODB.Connection не позволяет одновременно выполнять более одной команды, будь то простой SELECT, процедура или Action Query. Никак блокировок действий пользователя не произойдет, если для выполнения асинхронной операции открыть новое соединение. У этого способа есть два недостатка: При лицензии, ограничивающей количество одновременных подключений к SQL серверу легко привысить их лимит, и незначительное дополнительное ипользование ресурсов и клиента и сервера при открытии нового соединения. Кроме того на событие Fetch_Progress можно посадить DoEvents, что сделает фетчинг еще более прозрачным для пользователя. Я нисколько не возражаю против Вашего Сергей решения, но с точки зрения модели событий ADO мое выглядит более логичным.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32027143
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Дело в том, что ADODB.Connection не позволяет одновременно выполнять более одной команды
Честно говоря, я не понял, что вы этим хотели сказать. Если вы хотели сказать, что пока не будет выполнена первая, как вы говорите команда, а вторая будет ждать своей очереди, то вот опять же на основе предыдущего примера убедимся, что это не так:

Option Compare Database
Option Explicit
Dim con As ADODB.Connection
Dim WithEvents rstДолгий As ADODB.Recordset
Dim WithEvents rstКороткий As ADODB.Recordset
Dim blnФлагДолгий As Boolean
Dim blnФлагКороткий As Boolean

Private Sub Form_Open(Cancel As Integer)
Set con = New ADODB.Connection
con.ConnectionString = CurrentProject.Connection
con.Open
Set rstДолгий = New ADODB.Recordset
Set rstКороткий = New ADODB.Recordset
'Открываем рекордсет, у которого время выборки первой записи примерно секунд 10, а последней секунд 30
rstДолгий.Open "SELECT Выписка.* FROM Выписка WHERE (schet_dat > CONVERT(DATETIME, '2002-01-02 00:00:00', 102))", con, adOpenStatic, _
adLockOptimistic, adAsyncExecute
'Открываем рекордсет, у которого общее время выборки практически равно 0
rstКороткий.Open "SELECT * FROM test", con, adOpenStatic, _
adLockOptimistic, adAsyncExecute
End Sub


Private Sub rstДолгий_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _
ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)
If blnФлагДолгий = False And rstДолгий.State = adStateOpen Then
blnФлагДолгий = True
Set Me.Recordset = rstДолгий
End If
End Sub

Private Sub rstКороткий_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _
ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)
If blnФлагКороткий = False And rstКороткий.State = adStateOpen Then
blnФлагКороткий = True
Set Me.Recordset = rstКороткий
End If
End Sub
____________________________

В одном и том же конекшн con открываются два рекордесета. Первый(по очереди)- rstДолгий, второй rstКороткий. И не смотря на такую очередность при открытии, очередность возвращения данных с сервера будет обратной.

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

>Кроме того на событие Fetch_Progress можно посадить DoEvents, что сделает фетчинг еще
>более прозрачным для пользователя
Если в вашем варианте на событие Fetch_Progress посадить DoEvents, то это ничего не изменит, я проверял.

>с точки зрения модели событий ADO мое выглядит более логичным
Мне бы тоже хотелось, чтоб пользователь мог приступать к работе с формой как только на клиента приедет первая строка, но практика показала, я опять это повторю, что для того, чтоб не имела место, описанная мной выше блокировка со стороны Access, нужно подсовывать рекордсет форме на событии MoveComplete
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32027149
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под невозможностью одновременного выполнения в асинхронном режиме двух команд в одном коннекте я имею ввиду следующее:

Private WithEvents cn As ADODB.Connection

Private Sub Button1_Click()
Set cn = CurrentProject.Connection
cn.Execute "sp_who", , adAsyncExecute
cn.Execute "sp_lock", , adAsyncExecute
End Sub

Выдаст ошибку. Потому как в одно время в одном соединении может выполнятся только одна асинхронная задача
Но это выполнение. Одновременная пересылка нескольких результатов (фетчинг) в асинхронном режиме возможна.


А вот пример к которому Вы так стремитесь:

Private WithEvents rs As ADODB.Recordset

Private Sub Button1_Click()
Dim cmd As ADODB.Command, rs1 As ADODB.Recordset
Set rs1 = New ADODB.Recordset
rs1.ActiveConnection = CurrentProject.Connection
rs1.CursorLocation = adUseClient
rs1.CursorType = adOpenStatic
rs1.LockType = adLockOptimistic
rs1.Source = "SELECT * FROM Table1"
rs1.Open , , , , adAsyncExecute + adAsyncFetchNonBlocking
Set rs = rs1
End Sub

Private Sub rs_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
Static f As Boolean
If Not f Then
Set Me.Recordset = rs
f = True
End If
End Sub

И повнимательней: adAsyncExecute + a d A s y n c F e t c h N o n B l o c k i n g
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32027265
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, сначала по поводу вашего уточнения:

>cn.Execute "sp_who", , adAsyncExecute
>cn.Execute "sp_lock", , adAsyncExecute

а зачем вы так делаете? Это практические тоже самое, что и:
rst.Open
'и сразу после этого опять
rst.Open

>Дело в том, что ADODB.Connection не позволяет одновременно выполнять более одной команды
ADODB.Connection все позволяет, надо было просто сделать примерно так:

Dim con As ADODB.Connection
Dim cmd1 As New ADODB.Command
Dim cmd2 As New ADODB.Command
Set con = CurrentProject.Connection
With cmd1
.CommandText = "СохраненнаяПроцедура1"
.CommandType = adCmdStoredProc
Set .ActiveConnection = con
.Execute , , adAsyncExecute
End With
With cmd2
.CommandText = "СохраненнаяПроцедура2"
.CommandType = adCmdStoredProc
Set .ActiveConnection = con
.Execute , , adAsyncExecute
End With

Заметьте, все в одном конекшн.

По поводу асинхронного рекордсета. Действительно, константа adAsyncFetchNonBlocking, которую вы сейчас нашли, решает проблему блокировки! В споре рождается истина
Кстати, достаточно и одной из констант - adAsyncFetchNonBlocking(можно и без суммы).
Ну и чтоб все это быстрее работало, лучше составить такой текст процедуры rs_FetchProgress:

Private Sub rs_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
Set Me.Recordset = rs
adStatus = adStatusUnwantedEvent
End Sub

Тогда событие будет выполнено только один раз
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32027279
sysop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы правы, Сергей! Действительно обе команды асинхронно выполняются в единственном коннекте! И UnwantedEvent выглядит весьма элегантно. Плодотворный спор получился...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Ворос к знатокам - возможно ли запустить асинхронно?
    #32149691
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Команды выполняются в РАЗНЫХ коннектах. ADO самостоятельно отрывает новое соединение для второй команды.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32150486
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rs1.Source = "SELECT * FROM Table1"

а можно ли вместо "SELECT * FROM Table1" использовать ХП с параметрами ?
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32150488
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробовать лень?
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32150491
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Pavel
а как?
создать базу, формачки и искать ошибки во всем другом или в том что нужно?
потребуется слишком много timess для меня а если кто подскажет то можно будет ужо в следующем разе планировать использоание .
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32150496
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно ли вместо "SELECT * FROM Table1" использовать ХП с параметрами?
Можно и процедуру.
...
Рейтинг: 0 / 0
Ворос к знатокам - возможно ли запустить асинхронно?
    #32150501
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Pavel
что можно я ужо понял
остался вопрос как это будет выглядеть в тексте
не сочти за труд покажи
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ворос к знатокам - возможно ли запустить асинхронно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]