Размер библиотек

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#1
привет всем,
поделитесь своими соображениям по преодолению ограничения размера кода в библиотеках..
в частности, при написании кода классов с наследованием..
какие пути решения вы используете ?
 

morpheus

скриптописец
07.08.2006
3 915
1
#2
Тоже задумался над этим когда одна библиотека разрослась до 1,5 мегабайта... сейчас думаю о возможностях использования динамического кода ( описал , точнее перевёл и немного дополнил , - тут )
Дин. код даст возможность подключать библиотеки в секции Use тоже динамически и не хранить тонны кода в скр. библиотеках(а можно даже в обычных документах, что я реализовавывал). Хотя у этого метода очень много разных подводных камней и ограничений.Но загружаються эти бибилиотеки в память ТОЛЬКО по мере использования

Ну и плюс канечно разные оптимизации кода ( без заведения кучи ненужных переменных ), замена конструкций ттипа
Код:
 Dim ws as new NotesUIworkspace
Dim uidoc as NotesuiDocument
Set uidoc = ws.CurrentDocument
Dim doc as NotesDocument
Set doc = uidoc.Document
s = doc.GetItemValue( "MyField" )(0)


на такие
Код:
 Dim ws as new NotesUIworkspace
s = ws.CurrentDocument.Document.GetItemValue( "MyField" )(0)
да и тоже возможный вариант - это использование внешних библиотек - Dll
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#3
в данный момент у меня видимо что-то с руками не так, потому что клиент стал падать при повторных вызовах классов из библиотеки, размер библиотеки на самом деле маленький, но что-то в ней не так..
написал несколько классов:
1. базовый (в основном тут абстрактные функции)
2. наследник от 1
3. наследник от 2
4. наследник от 2
5. сам по себе (работа с файлом настроек), используется в 3 и 4

все эти классы лежат в одной либе.. для использования классов 2,3,4 в события бд были созданы 3 отдельные библиотеки, в которых инициализировался только один класс (2, 3, или 4)

когда класса было четыре все работало и настройки сохранялись в персональный документ, затем я решил настройки выносить в файл и добавил класс(по аналогии с функциями get, set для environment изменения параметров в notes.ini) для работы с файлом.. работа данными с файла производится через notesstream..

тестировал этот класс агентом все работало..

а теперь при повторном использовании библиотеки 4 (в начале идет считывание настроек из файла) вижу падение клиента.. сижу и туплю, не понимая в чем дело

извините, что немного поторопился с созданием темы, я почему-то решил что дело в размере.. видимо дело в качестве кода или подводных камнях лотуса, которые пока не увидел..
 

morpheus

скриптописец
07.08.2006
3 915
1
#4
ну у меня с 1,5 метровой бибиллотеки - падений небыло ... так что дело не в размере. Тем более что Вы говорите что он маленький...

самые простые варианты - перепрописать в use - библиотеки... пересохранять библиотеки как с классами так и те которые используют классы.. ну и канечно вести логи ошибок со строками и т.д.

а в 5м классе с notesstream -что там с обработчиком ошибок ?
 
A

Archi2001

#5
Kee_Keekkenen у вас 4 класса или библиотеки? просто вот тут речь про библиотеки:
а теперь при повторном использовании библиотеки 4
скорее всего где-то "закольцовано" использование библиотек... из-за такого клиент на самом деле может падать...
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#6
а в 5м классе с notesstream -что там с обработчиком ошибок ?
ошибок нет, в том то и дело просто падает лотус и все.. например use либы используется на форме, при повторном открытии документа по этой форме и происходит падение..

причина в некорректном коде 5 либы с notesstream частое открытие/закрытие файла в поток и валит лотус

скорее всего где-то "закольцовано" использование библиотек... из-за такого клиент на самом деле может падать...
в мое случае это не то, после падения я вынес каждый класс в отдельную библиотеку и тут уже трудно перепутать где и что лежит..
 
A

Archi2001

#7
Kee_Keekkenen не... извиняюсь, я немного некорректно выразился... я про закольцованность типа:

у вас есть библиотеки lib1 и lib2 .... например, в lib1 используется "lib2" ....
а есть форма, в которой указано "Use lib1 и Use lib2" .... когда библиотек немного, падения клиента может и не быть, а когда исрользуется не одна "перекрёстная" библиотека - падения клиента возможны...
т.е. в форме достаточно указать "родительскую" библиотеку... если остальные библиотеки от нее наследуются, то указывать их использование в форме (и пр.) не нужно...
 
S

Sandr

#8
Ну и плюс канечно разные оптимизации кода ( без заведения кучи ненужных переменных ), замена конструкций ттипа
Код:
 Dim ws as new NotesUIworkspace
Dim uidoc as NotesuiDocument
Set uidoc = ws.CurrentDocument
Dim doc as NotesDocument
Set doc = uidoc.Document
s = doc.GetItemValue( "MyField" )(0)


на такие
Код:
 Dim ws as new NotesUIworkspace
s = ws.CurrentDocument.Document.GetItemValue( "MyField" )(0)
Боже упаси от такой оптимизации... не читабельно совсем...
А размер библиотеки совсем не проблема...До 2-х Гб работает нормально, а это болдее чем достаточно... :) Тем более на производительность не влияет...
 
S

Sandr

#10
Нет, не надо, так как это не только мое мнение.. с ним, уверен, согласистя большинство :D

ScriptLib = 2 Gb вот такого я ещё не видел )))
Я тоже не видел, 2 Гига - потолок для библиотеки просто :lol:
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#11
я все еще в тупике..
допустим есть иерархия наследования классов и при инициализации самого последнего наследника происходит компиляция кода, в который встраиваются по крайней мере константы, функции и процедуры используемые в конструкторах (и те, от которых они зависят), а также все методы инициализируемого класса, т.о. может получиться внушительный код..

т.о. по отдельности классы могут быть не большими, а в результате наследования "собака могла подрасти"
каков у вас размер таких "конструкций", не библиотек, а именно таким образом связанных объектов?..

все-таки у меня есть смутное подозрение об ограничении размера загружаемого компилированного LS-кода..

мое подозрение о кривости кода 5-го класса не подтвердилось, переписав 5-й класс по другому, но клиент падает по прежнему..

осталось проанализировать 4-й класс, использующий 5-й (3-й, использующий 5-й работает)..

больше всего в данной ситуации достает тот момент, что один раз функциональность выполняется, но при повторном вызове - падет
 
K

K-Fire

#12
Отдебаггить весь код пока не найдете конкретную строку где клиент умирает пробовали?

Recompile all LS пробовали?
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#13
Отдебаггить весь код пока не найдете конкретную строку где клиент умирает пробовали?

Recompile all LS пробовали?
1 невозможно, т.к. код либы используется через use в форме и падение происходит при открытии документа - щелкаешь по документу 1-й раз все работает, 2-й разпадает( даже если инициализировать класс прямо на форме)..
2 не помогает
 
K

K-Fire

#14
А эта либа где в форме юзается? В Globals? Если да, попробуйте перенести Use в какое-нить другое место, например просто в Options формы, или на конкретные акшны/хотспоты.
 
S

Sandr

#15
Клиент падает совсем не из-за размера кода... Что-то Вы там такое просто делаете, что не нравится клиенту... Тока дебажить...
Если дебагером не выходит - есть же принты и мессаджбоксы... ;)
 
K

K-Fire

#16
Я заметил, что когда есть либы с классами, и одна используется в другой, то лотус видимо при загрузке в форме этих либ начинает толи перекомпиливать их, толи какие-то еще хитрые операции происходят. Как пример - у меня была либа с классами, когда она была в Globals - форма открывалась по 10 секунд. Стоило убрать её из глобалсов на хотспоты - форма стала открываться мгновенно. Причем отработка кода в хотспотах тоже мгновенно происходила. Версия клиента 6.5.1.

Похоже что в глобалсах классовые либы юзать просто нельзя из-за каких-то непонятных багов.
 
S

Sandr

#17
Я заметил, что когда есть либы с классами, и одна используется в другой, то лотус видимо при загрузке в форме этих либ начинает толи перекомпиливать их, толи какие-то еще хитрые операции происходят. Как пример - у меня была либа с классами, когда она была в Globals - форма открывалась по 10 секунд. Стоило убрать её из глобалсов на хотспоты - форма стала открываться мгновенно. Причем отработка кода в хотспотах тоже мгновенно происходила. Версия клиента 6.5.1.

Похоже что в глобалсах классовые либы юзать просто нельзя из-за каких-то непонятных багов.
А тут ничего удивительного нет.
Если Вы пихатете use в глобал Options, то все что у Вас в декларейшене и инициализации библиотеки отрабатывает при открытии документа. Если же вы вешаете юз на хотспот, то все это дело отрабатывает при клике на хотспот.. по-моему все правильно и логично... Так что если у Вас таких хотспотов 2 и больше, то правильней вешать юз на глобальный опшинс и пожертвовать этой парой секунд при открытии документа, а не ждать эти парку секунд при каждом клике на хотспот...
 
K

K-Fire

#18
Нет, всё не так. В такой либе у меня ничего не было в инициализации.
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#19
K-Fire
в данный момент при тестировани использую use "ACCstart" Options формы, а в инициализации формы инициализирую данный класс

вот мои классы
1. Class ACCommon - в основном функции
2. Class ACCbase As ACCommon - доступ к базе
3. Class ACC As ACCbase - доступ к данным, использует ACCOptions для занесения параметров доступа в файл, отрабатывает при открытии бд
4. Class ACCstart As ACCbase - на основе параметров доступа сохраненных ранее, разрешает запрещает доступ к данным, использует ACCOptions для считывания параметров
5. Class ACCOptions - работа с файлом настроек (читает/пишет в файл строки параметр=значение)

проблема возникает при использовании класса ACCstart, совместно с ACCOptions при чем падение может возникать, как до инициализации объекта класса ACCOptions, во время получения значения параметров, так и после того, как все отработало, а именно при ЗАКРЫТИИ документа, только что открытого документа..
но падает клиент только после повторного открытия одного и того же документа, хотя я принудительно удаляю и в внутри классов и снаружи после их отработки

для чистоты закомментировал весь код класса ACCstart кроме инициализации класса ACCOptions и получения нескольких параметров, и процедуры закрытия класса

может быть проблема в листе, который я использую
Код:
Type param
value As String
End Type
Private data List As param
при инициализации ACCOptions данные из файла с параметрами заносятся в лист
Код:
If Not checkFile( filePath) Then Exit Sub
filenum = Freefile()
Open filePath For Input Lock Write As filenum Charset=DEFCHARSET
Do Until Eof(fileNum)			
Line Input #fileNum, text
If text <> "" And Instr( text, PD) > 0 Then 
data(Strtoken( text, PD, 1)).value = Strtoken( text, PD, 2)
End If
Loop
Close filenum
при закрытии класса, если данные менялись, то переписываются данные в файл
Код:
	Sub close		
Dim filenum As Integer
try:
On Error Goto catch
If isDataChanged Then
filenum = Freefile()
Open filePath For Output Lock Write As filenum Len=1000 Charset=DEFCHARSET 
Forall dat In data
Print #filenum, Listtag(dat) & PD & dat.value
End Forall
Close filenum
End If
Erase data
Set ses = Nothing		
Exit Sub
catch:
Call errh (Getthreadinfo(1) & " (Class ACCOptions)", False)
Exit Sub
End Sub
ну и собственно, занесение и получение значения параметров
Код:
Function setEnvir( key As String, value As String) As Boolean		
try:
On Error Goto catch			
If data(key).value <> value Then
data(key).value = value			
isDataChanged = True
End If
Exit Function
catch:
Call errh (Getthreadinfo(1) & " (Class ACCOptions)", False)
Exit Function
End Function
'--------------------------------------------------------------------------------------------------------------------------------------					
Function getEnvir( key As String) As String		
try:
On Error Goto catch		
getEnvir = data(key).value
Exit Function
catch:
Call errh (Getthreadinfo(1) & " (Class ACCOptions)", False)
Exit Function
End Function
'--------------------------------------------------------------------------------------------------------------------------------------
вроде все логично, но почему лотус падает, когда получаем данные не понятно ?!
может кто сталкивался с подобным ?
 

Omh

Lotus team
04.07.2007
2 210
1
#20
Так что если у Вас таких хотспотов 2 и больше, то правильней вешать юз на глобальный опшинс и пожертвовать этой парой секунд при открытии документа, а не ждать эти парку секунд при каждом клике на хотспот...
Ошибочка вышла.
Библиотека не инициализируеться при каждом клике на хотспот, а только 1 раз.
Т.е. возможно, что первый клик будет работать дольше других, но все последующие будут без инициализации.
Такое поведение под 7.0.2