|
|
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
есть форма на ней ОЧЕНЬ много подчиненных которые желательно обновлять но если запускать обновление всякий раз когда это нужно - получаются тормоза возможно ли запустить асинхронно object.requery ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2002, 09:50 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
DAO - не помню. ADO - программно открывай рекордсет обьявленный with events с опцией AsyncExecute+AsyncFetching, при первом событии Fetchprogress имеем готовый, но не до конца заполненный рекордсет, который уже можно подсунуть форме. Лучше всего создать класс в котором все это варится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2002, 08:23 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Вспомнил. В DAO никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2002, 10:23 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
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) проверял? Или твой совет чисто теоретический? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2002, 11:48 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Ответ чисто практический. Не то что проверял, все это крутится почти 2 года. Завтра, если интересно, могу вывалить пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2002, 15:08 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
2SysOp Давай пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2002, 13:02 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2002, 02:39 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
дело в том что в качестве источника записей испоьзуется XP с параметрами типа строка - а параметр почему то не хочет ничего воспринимать ничего кроме числового формата. Но тем не менее удалось избежать тормозов при вводе- в главную форму - секутндный таймер проверяющий состояние двух общих переменных(нисколько не замедляет) - одна что внесены изменения -вторая показатель активности - что пользователь активно вбивает данные и пока не смотрит на сумму. таймером каждый раз сбрасывается вторая переменная. когда пользователь перестает вдалбливать данные таймер обнаруживает нулевой показатель активности и выполняет необходимые процедуры обновления связанных форм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2002, 08:19 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
А что, нельзя сумму из под кнопки сделать? насчет строкового парамтра - если правильно прописал строчку в InputParameters проблем быть не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2002, 10:07 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Для 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, как в вашем варианте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2002, 18:29 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Дело в том, что ADODB.Connection не позволяет одновременно выполнять более одной команды, будь то простой SELECT, процедура или Action Query. Никак блокировок действий пользователя не произойдет, если для выполнения асинхронной операции открыть новое соединение. У этого способа есть два недостатка: При лицензии, ограничивающей количество одновременных подключений к SQL серверу легко привысить их лимит, и незначительное дополнительное ипользование ресурсов и клиента и сервера при открытии нового соединения. Кроме того на событие Fetch_Progress можно посадить DoEvents, что сделает фетчинг еще более прозрачным для пользователя. Я нисколько не возражаю против Вашего Сергей решения, но с точки зрения модели событий ADO мое выглядит более логичным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2002, 04:53 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
>Дело в том, что 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2002, 13:56 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Под невозможностью одновременного выполнения в асинхронном режиме двух команд в одном коннекте я имею ввиду следующее: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2002, 19:18 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Ну, сначала по поводу вашего уточнения: >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 Тогда событие будет выполнено только один раз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2002, 17:55 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Вы правы, Сергей! Действительно обе команды асинхронно выполняются в единственном коннекте! И UnwantedEvent выглядит весьма элегантно. Плодотворный спор получился... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2002, 05:01 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
Команды выполняются в РАЗНЫХ коннектах. ADO самостоятельно отрывает новое соединение для второй команды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2003, 06:33 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
rs1.Source = "SELECT * FROM Table1" а можно ли вместо "SELECT * FROM Table1" использовать ХП с параметрами ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2003, 19:56 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
А попробовать лень? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2003, 20:07 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
2Pavel а как? создать базу, формачки и искать ошибки во всем другом или в том что нужно? потребуется слишком много timess для меня а если кто подскажет то можно будет ужо в следующем разе планировать использоание . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2003, 20:19 |
|
||
|
Ворос к знатокам - возможно ли запустить асинхронно?
|
|||
|---|---|---|---|
|
#18+
а можно ли вместо "SELECT * FROM Table1" использовать ХП с параметрами? Можно и процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2003, 20:39 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32150501&tid=1681680]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 357ms |

| 0 / 0 |
