powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оператор with. Нужно ли в нём закрывать созданный в нём объект?
17 сообщений из 42, страница 2 из 2
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971185
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melihron,

В последнем примере уже появились переменные)
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971190
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем нифига рекордсет не уничтожается. И существует за пределами блока With.
Поэтому по теме топика нужно выделять его отдельно, закрывать и грохать отдельно. Надеюсь это и было главным вопросом)
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971191
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
Остаётся поверить майкрософту на слово, что внутри блока with происходит уничтожение
речь была не о том, ну ладно...
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971192
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
В общем нифига рекордсет не уничтожается. И существует за пределами блока With.
Поэтому по теме топика нужно выделять его отдельно, закрывать и грохать отдельно. Надеюсь это и было главным вопросом)

А с какого перепугу он rs должен уничтожиться?
Если существует хоть одна ссылка на объект.(это объектная переменная rs).
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971193
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов
Код: vbnet
1.
2.
3.
4.
5.
6.
With DBEngine(0)(0)
   Set rs = .OpenRecordset("таблица")
   MsgBox ObjPtr(rs)
  End With
  MsgBox ObjPtr(rs)
End Sub



Вот здесь после присвоения, область видимости рекордсета простирается и за пределы блока With. И он жив. Но это потому что я объявил его в самом теле With. Хитрый вопрос.

Если убрать Set , то тоже жив.

ну тут естессьтно рекордсет не уничтожится, поскольку он присвоен переменной, область видимости которой вне блока With...

Это как у индейцев Навахо штоли... "человек жив до тех пор, пока жив последний помнящий о нём"..... так и тут... : )

Вот у других языков высокого уровня, как си шарп, джава, специально созданы и описаны так называемые сборщики мусора, которые работают по своему расписанию и алгоритму... благодаря которым точно можно быть уверенным, что незакрытый объект уничтожится через какое-то время, если до конца работы процедуры к нему не будет обращений, и утечки памяти не будет... а здесь ... хрен знает...
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971197
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melihron
... а здесь ... хрен знает...


Выделяй его отдельно из Dbengine как на примере чуть выше, закрывай и уничтожай. Потому что рекордсет прекрасно себя чувствует и живет после блока With. В качестве объектной переменной ссылочного типа. Потестили,убедились, приняли решение, сделали,как то так))
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971199
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melihron
Вот у других языков высокого уровня, как си


melihron
специально созданы и описаны так называемые сборщики мусора, которые работают по своему расписанию и алгоритму...

melihron
благодаря которым точно можно быть уверенным, что незакрытый объект уничтожится через какое-то время

Ну Ну
у Си всё ручками батенька ручками.
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971201
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и на шарпее с джавой не все гладко со сборщиками мусора. ТС с потоками видимо мало общался в них.
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971206
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROI,
Вы правы, но ссылка на объект существует даже и при
With dbEngine(0)(0). OpenRecordset()

Воот если бы в vba можно было написать как в том же шарпе или vb типа такого

With New DbEngine(0)(0).openRecordset()
То можно было бы сказать что все схлопывается на end with.

А тут фиг знает.
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971215
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
ROI,
Вы правы, но ссылка на объект существует даже и при
With dbEngine(0)(0). OpenRecordset()

Воот если бы в vba можно было написать как в том же шарпе или vb типа такого

With New DbEngine(0)(0).openRecordset()
То можно было бы сказать что все схлопывается на end with.

А тут фиг знает.

Да ни какого фига.
Как только вы выйдете за пределы процедуры всё схлопнется,
а зачем вам эти извращения с with?
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971216
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROI,

Да интересный вопрос у ТС, вот реально, как проверить то, что все что написано в сигнатуре / объявлении With схлопнулось в конце блока?
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971219
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
..., как проверить ...

Не?: (обработчик ошибок специально не добавлял)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Sub Test()
Dim strName As String
Dim n1 As String
Dim n2 As String

Debug.Print "Recordsets.Count", DBEngine(0)(0).Recordsets.Count
  With DBEngine(0)(0).OpenRecordset("select * from table1")
    Debug.Print "=========== inner With"
    strName = .Name
    Debug.Print strName
    Debug.Print "Recordsets.Count", DBEngine(0)(0).Recordsets.Count
    n1 = .Fields(1)
    n2 = .Fields(2)
  End With
  Debug.Print "=========== outer With"
Debug.Print "Recordsets.Count", DBEngine(0)(0).Recordsets.Count
Debug.Print DBEngine(0)(0).Recordsets(strName).Name
End Sub
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971445
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Predeclared
Сергей Лалов
..., как проверить ...

Не?: (обработчик ошибок специально не добавлял)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Sub Test()
Dim strName As String
Dim n1 As String
Dim n2 As String

Debug.Print "Recordsets.Count", DBEngine(0)(0).Recordsets.Count
  With DBEngine(0)(0).OpenRecordset("select * from table1")
    Debug.Print "=========== inner With"
    strName = .Name
    Debug.Print strName
    Debug.Print "Recordsets.Count", DBEngine(0)(0).Recordsets.Count
    n1 = .Fields(1)
    n2 = .Fields(2)
  End With
  Debug.Print "=========== outer With"
Debug.Print "Recordsets.Count", DBEngine(0)(0).Recordsets.Count
Debug.Print DBEngine(0)(0).Recordsets(strName).Name
End Sub

Отличный наглядный пример, спасибо бро...

также Recordsets.Count показывает ноль после такой конструкции:
Код: vbnet
1.
n = DBEngine(0)(0).OpenRecordset("select field1 from tablya").Fields(0).Value


ну что... вроде тогда похоже, что действительно, после выхода из области видимости, объектные переменные освобождают занятую ими память... надеюсь этого хватит) и смело можно забить на закрытие объекта внутри блока With.

Нюанс только один... если рекордсет объявлять через CurrentDB (вместо DBEngine(0)(0)), то Recordsets.Count везде показывает ноль... и обратиться к рекордсету ни через CurrentDb.Recordsets(strName), ни через DBEngine(0)(0).Recordsets(strName) не получается... странно, не понятно... но разбираться в этом уже чё-то нет желания)... CurrentDB - это вроде как ссылка на DBEngine(0)(0)... вроде... но если через неё работать, я заметил, что скорость у ней меньше, а глюков больше... поэтому стараюсь с ней не связываться...

Благодарю всех за помощь и участие : ) много нового узнал... тема не закрыта, если есть желание что-то по ней обсудить и поделиться опытом, всегда пажалста... : )
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971484
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Любителям порасшибать лоб самостоятельно и прочим нечитателям посвящаеЦЦа.

БерёЦЦа библиотека типов или аналогичная, содержащая описание интерфейса IUnknown.

ПишеЦЦа функция:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Function RefCount(ByVal obj As Object) As Long
 'Возвращает -1, если параметр равен Nothing;
 '            0, если параметр - экземпляр объекта, который будет автоматически
 '               уничтожен (как предполагаеЦЦа) сразу после вычисления выражения,
 '               в котором вычисляется RefCount().
 '   значение>0, если на объект-параметр были ссылки до вычисления выражения,
 '               в котором вычисляется RefCount(). Значение равно количеству
 '               ссылок.
 If obj Is Nothing Then RefCount = -1: Exit Function
 
 Dim Unk As oleexp.IUnknown
 Set Unk = obj
 RefCount = Unk.AddRef - 4
 Unk.Release
End Function

, тестовый класс Class1:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Option Explicit

Private Sub Class_Initialize()
 Debug.Print "Class1 instance initialized"
End Sub

Private Sub Class_Terminate()
 Debug.Print "Class1 instance terminated"
End Sub

, тестовые процедуры:
Код: vbnet
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Option Explicit

Public Sub Test1()
 Debug.Print "Test1 after start"
 Debug.Print "Before RefCount call"
 Debug.Print "RefCount = " & RefCount(New Class1)
 Debug.Print "After RefCount call"
 Debug.Print "Test1 before end"
End Sub

Public Sub Test2()
 Debug.Print "Test2 after start"
 Debug.Print "Before RefCount call" & vbCrLf & "RefCount = " & _
              RefCount(New Class1) & vbCrLf & "After RefCount call"
 Debug.Print "Test2 before end"
End Sub

Public Sub Test3()
 Debug.Print "Test3 after start"
 Dim rs As Class1
 Debug.Print "After Dim. RefCount = " & RefCount(rs)
 
 Set rs = New Class1
 Debug.Print "After Set New. RefCount = " & RefCount(rs)
 
 With rs
    Debug.Print "After With. RefCount = " & RefCount(rs)
 End With
 
 Debug.Print "After End With. RefCount = " & RefCount(rs)
 
 Set rs = Nothing
 Debug.Print "After Set Nothing. RefCount = " & RefCount(rs)
 Debug.Print "Test3 before end"
End Sub

Public Sub Test4()
 Debug.Print "Test4 after start"
 Dim rs As Class1
 Debug.Print "After Dim. RefCount = " & RefCount(rs)
 
 Set rs = New Class1
 Debug.Print "After Set New. RefCount = " & RefCount(rs)
 
 With rs
    Debug.Print "After With. RefCount = " & RefCount(rs)
 End With
 
 Debug.Print "After End With. RefCount = " & RefCount(rs)
 Debug.Print "Test4 before end"
End Sub


Тесты запускаюЦЦа, результаты в отладочном окне анализируюЦЦа поодиночке и в группе, возникает непреодолимое желание прочитать хотя бы несколько первых глав у Роджерсона. Хотя последнее вряд ли.

Наслаждайтесь!
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971600
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,
Затестил, да, спс, работает. Из коллекции workspace (0) databases(0) он исчезает. По всей видимости и уничтожается.
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971602
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦа,
Знакомый акцент, встречал в топиках 15 летней давности. С Бенедиктом не общаетесь случайно?
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971630
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦа,

Отслеживание количество ссылок на экземпляры-это не для нас.
мы лучше гадать будем
И будем создавать объекты где непопадя и когда непопадя
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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