powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выполнение в фоновом режиме
4 сообщений из 4, страница 1 из 1
Выполнение в фоновом режиме
    #32246121
Фотография Alviga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как сделать, чтобы процедура выполнялась в фоновом режиме и не вешала приложение на несколько минут. Процедура это подключение к удаленному SQL серверу через интернет.
Как сделать, чтобы пока она выполнялась можно было делат что-то еще в данном приложении. Например открыть еще форму и вбивать в ней текст.

Private Sub Command1_Click()
On Error GoTo error
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

cn.Open "Provider=SQLOLEDB.1;Password=qwerty;Persist Security Info=True;User ID=sa;Initial Catalog=northwind;Data Source=213.189.220.105,8080"
rs.Open "Select EmployeeID from employees", cn, adOpenStatic, adLockReadOnly
Set VSFlexGrid1.DataSource = rs


Exit Sub
error:
MsgBox "Can't establish connection to SQL server. Try again later" + Err.Description

End Sub
...
Рейтинг: 0 / 0
Выполнение в фоновом режиме
    #32246183
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рекордсет может работать асинхронно - смотри параметры в справке. В этом случае он может генерить события Progress, перезватывая его ты будешь знать, как идут дела.
...
Рейтинг: 0 / 0
Выполнение в фоновом режиме
    #32247713
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Событийное управление реализуется только для объектов, объявленных with Events. Создайте свой класс, в который поместите нечто подобное:
Код: plaintext
1.
2.
3.
Private WithEvents cnE As ADODB.Connection     'указатель на Event-handled подключение
Private WithEvents rsOrg As ADODB.Recordset    'указатель на Event-handled рекордсет
Private cmd As New ADODB.Command

2. Подключитесь к серверу, задайте параметры cmd и cmd.Parameters.Refresh
3. выполните команду и направьте результаты её работы в рекордсет:
Код: plaintext
1.
    Set rsOrg = cmd.Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking + adAsyncExecute)

4. Состояние выполнения команды перехватывайте обработчиками событий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Private Sub cnE_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
'The ExecuteComplete event is called after a command has finished executing.
DoEvents
If Not (pError Is Nothing) Then
    If pError.Number <> 0 Then
        Dim s As String
        s = pError.Number & Comma & pError.Description & Comma & pError.Source & vbCrLf '
        Dim sErr As Error
        For Each sErr In pConnection.Errors
            s = s & sErr.Number & Comma & sErr.Source & Comma & sErr.Description & vbCrLf
        Next sErr
        Err.Clear
'    установить свойство класса "Операция выполнена с ошибкой, к-во записей=0"         
' .............        
    End If
Else
    With pRecordset
        If .State = ObjectStateEnum.adStateClosed Then
 '    операция выполнена, удовлетворяющих запросу записей нет:
                rsOrgOK = True       'Ваши идентификаторы, естественно, другие...
                rsOrgRows =  0 : rsMaxRows =  0 
'     возбудить пользовательский обработчик события "Рекордсет получен":
                RaiseEvent RsDone(...)
        Else
'    настроить параметры пакетов для пересылки рекордсета клиенту:
                .CacheSize = .RecordCount
                rsMaxRows = .RecordCount
        End If
    End With
End If
End Sub

Private Sub rsOrg_FetchProgress(....)
'   ..............
End Sub

Private Sub rsOrg_FetchComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
'  ..............
End Sub


5. Эти события - собственность класса, а приложение должно использовать свои обработчики, вызываемые (возбуждаемые) отсюда по имени (RsDone, например).
6. Высокоуровневые классы-посредники (типа DataSource) маскируют многие вещи, поэтому целесообразно на этапе отладки от них отказаться.
...
Рейтинг: 0 / 0
Выполнение в фоновом режиме
    #32247743
paragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а еще можно с помощью API организовать выполнение процедуры в другом, новом потоке...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выполнение в фоновом режиме
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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