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

Тема в разделе "Lotus - Программирование", создана пользователем Kee_Keekkenen, 21 мар 2008.

  1. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    привет всем,
    поделитесь своими соображениям по преодолению ограничения размера кода в библиотеках..
    в частности, при написании кода классов с наследованием..
    какие пути решения вы используете ?
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Тоже задумался над этим когда одна библиотека разрослась до 1,5 мегабайта... сейчас думаю о возможностях использования динамического кода ( описал , точнее перевёл и немного дополнил , - тут )
    Дин. код даст возможность подключать библиотеки в секции Use тоже динамически и не хранить тонны кода в скр. библиотеках(а можно даже в обычных документах, что я реализовавывал). Хотя у этого метода очень много разных подводных камней и ограничений.Но загружаються эти бибилиотеки в память ТОЛЬКО по мере использования

    Ну и плюс канечно разные оптимизации кода ( без заведения кучи ненужных переменных ), замена конструкций ттипа
    Код (Text):
     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)


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

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    в данный момент у меня видимо что-то с руками не так, потому что клиент стал падать при повторных вызовах классов из библиотеки, размер библиотеки на самом деле маленький, но что-то в ней не так..
    написал несколько классов:
    1. базовый (в основном тут абстрактные функции)
    2. наследник от 1
    3. наследник от 2
    4. наследник от 2
    5. сам по себе (работа с файлом настроек), используется в 3 и 4

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

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

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

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

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    ну у меня с 1,5 метровой бибиллотеки - падений небыло ... так что дело не в размере. Тем более что Вы говорите что он маленький...

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

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

    Archi2001 Гость

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

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    ошибок нет, в том то и дело просто падает лотус и все.. например use либы используется на форме, при повторном открытии документа по этой форме и происходит падение..

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

    в мое случае это не то, после падения я вынес каждый класс в отдельную библиотеку и тут уже трудно перепутать где и что лежит..
     
  7. Archi2001

    Archi2001 Гость

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

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

    Sandr Гость

    Боже упаси от такой оптимизации... не читабельно совсем...
    А размер библиотеки совсем не проблема...До 2-х Гб работает нормально, а это болдее чем достаточно... :) Тем более на производительность не влияет...
     
  9. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    нужно добавлять "имхо"


    ScriptLib = 2 Gb вот такого я ещё не видел )))
     
  10. Sandr

    Sandr Гость

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

    Я тоже не видел, 2 Гига - потолок для библиотеки просто :lol:
     
  11. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    я все еще в тупике..
    допустим есть иерархия наследования классов и при инициализации самого последнего наследника происходит компиляция кода, в который встраиваются по крайней мере константы, функции и процедуры используемые в конструкторах (и те, от которых они зависят), а также все методы инициализируемого класса, т.о. может получиться внушительный код..

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

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

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

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

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

    K-Fire Гость

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

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

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    1 невозможно, т.к. код либы используется через use в форме и падение происходит при открытии документа - щелкаешь по документу 1-й раз все работает, 2-й разпадает( даже если инициализировать класс прямо на форме)..
    2 не помогает
     
  14. K-Fire

    K-Fire Гость

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

    Sandr Гость

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

    K-Fire Гость

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

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

    Sandr Гость

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

    K-Fire Гость

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

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    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 и получения нескольких параметров, и процедуры закрытия класса

    может быть проблема в листе, который я использую
    Код (Text):
    Type param
    value As String
    End Type
    Private data List As param
    при инициализации ACCOptions данные из файла с параметрами заносятся в лист
    Код (Text):
    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
    при закрытии класса, если данные менялись, то переписываются данные в файл
    Код (Text):
        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
    ну и собственно, занесение и получение значения параметров
    Код (Text):
               
    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
    '--------------------------------------------------------------------------------------------------------------------------------------
    вроде все логично, но почему лотус падает, когда получаем данные не понятно ?!
    может кто сталкивался с подобным ?
     
  20. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ошибочка вышла.
    Библиотека не инициализируеться при каждом клике на хотспот, а только 1 раз.
    Т.е. возможно, что первый клик будет работать дольше других, но все последующие будут без инициализации.
    Такое поведение под 7.0.2
     
Загрузка...

Поделиться этой страницей