Вылетает ошибка при закрытии формы крестиком (Exit) на форме.
В самом проекте: присоединяюсь к локальной mdb базе, и жду результат выборки (асинхронно).
Если в этот момент жму на крестик, иногда вылетает ошибка и программа грохается.
Это происходит не всегда, очень трудно поймать этот момент.
Попробовал очень много вариантов, чтобы найти причину, в данный момент сделано следующее:
1. перенес все связанное с ADO в отдельный класс. В Class_Terminate поставил код
- Код: Выделить всё
]If Not r Is Nothing Then
Do While r.State = adStateExecuting
r.Cancel
Loop
Do While r.State = adStateOpen
r.Close
Loop
End If
If Not cn Is Nothing Then
Do While cn.State = adStateConnecting
cn.Cancel
Loop
Do While cn.State = adStateOpen
cn.Close
Loop
End If
Set r = Nothing
Set cn = Nothing
ClassIsBisy=False
2. в Form_QueryUnload посадил код
- Код: Выделить всё
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Not cnn Is Nothing Then ' (cnn объект моего класса)
Do While cnn.ClassIsBisy
DoEvents
Loop
Set cnn = Nothing
End If
End Sub
3. во всем проекте после каждой строчк и (!!!) вызываю маленькую функцию и пишу информацию в текстовый файл.
по этому файлу видно что, не смотря на то, когда произошло нажатие крестика на форме, код всегда корректно доходит до закрытия Connection, и класса, и выхода из цикла в Form_QueryUnload только после этого. Но после этого программа все ровно валится.
После открытия C++ дебагера (где ничего абсолютна не понимаю) пошаговом режиме смотрю что авария происходит на шаге
- Код: Выделить всё
call ntdll.RtlExitUserTread
- Код: Выделить всё
call ntdll.NtRaiseExeption
Поиском, в гуугле, эта комбинация слов встречается всего один раз, и то в нашем форуме.
Если этот баг не исправлю, дальше двигаться не имеет смысла.
Что можно предпринять, и о чем говорят приведенные моменты из дебагера, полезном для поиска неисправности.
Спасибо заранее!