powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Непонятности с асинхронным запросом
3 сообщений из 3, страница 1 из 1
Непонятности с асинхронным запросом
    #34099210
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вечер добрый.
Вот с таким я к вам вопросом.
Мне нужно выполнить запрос асинхронно. Причем не только выполнить, но и заполнить данными, тоже асинхронно. Т.е. обычный ленивый путь (в FetchProgress рисовать индикатор, а в FetchComplete использовать данные) не годится, нужно загружать данные уже в FetchProgress.
Сделал такую обработку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub objADORecordset_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
  Debug.Print "Fetching... " & " (" & Progress & "/" & MaxProgress & ")" & " -- #" & pRecordset.AbsolutePosition
  List1.Visible = False
  Do
    List1.AddItem pRecordset.AbsolutePosition & " - " & pRecordset.Fields( 2 )
    If pRecordset.AbsolutePosition < Progress Then
      pRecordset.MoveNext
      If pRecordset.AbsolutePosition = Progress And Progress < MaxProgress Then Exit Do
    Else
      Exit Do
    End If
  Loop
  List1.Visible = True
  Caption = List1.ListCount
End Sub
Работает замечательно, но только если Background Fetch Size больше 1.
Если Background Fetch Size = 1, то по непонятной причине курсор прыгает примерно таким образом (значения AbsolutePosition):
1, 2, 3, 2, 3, 4, 5, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 9, ...
С какого перепугу образуется такая прогрессия, нижняя граница которой увеличивается на один, а верхняя на два, я так и не понял. Ткнув пальцем в небо предположу, что рекурсивные вызовы события перекрывают друг друга.
Чтобы процедура получилась универсальной и работала и при размере буфера равном 1, пришлось вводить такие костыли:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub objADORecordset_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
  Static StoredPosition As Long 'костыль
  Debug.Print "Fetching... " & " (" & Progress & "/" & MaxProgress & ")" & " -- #" & pRecordset.AbsolutePosition
  If StoredPosition >  0  Then pRecordset.AbsolutePosition = StoredPosition 'костыль
  List1.Visible = False
  Do
    List1.AddItem pRecordset.AbsolutePosition & " - " & pRecordset.Fields( 2 )
    If pRecordset.AbsolutePosition < Progress Then
      pRecordset.MoveNext
      If pRecordset.AbsolutePosition = Progress And Progress < MaxProgress Then Exit Do
    Else
      Exit Do
    End If
  Loop
  StoredPosition = pRecordset.AbsolutePosition 'костыль
  List1.Visible = True
  Caption = List1.ListCount
End Sub
Но нельзя ли обойтись без него?

Система Windows 2000 со всеми обновлениями, ADO 2.8.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Непонятности с асинхронным запросом
    #34099321
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не костыль, это правильно. FetchProgress не обязана запускаться на каждую полученую запись.
...
Рейтинг: 0 / 0
Непонятности с асинхронным запросом
    #34099467
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да пусть запускается хоть через десять записей. Просто в следующий раз Progress будет на 10 больше.
Но у меня то получается совсем не то? Progress всегда только на 1 больше, т.е. FetchProgress запускается на каждую запись. А вот AbsolutePosition почему-то меняется произвольно между вызовами события.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Непонятности с асинхронным запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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