Background Agent кидается красным квадратом

Тема в разделе "Lotus - Программирование", создана пользователем Omh, 29 июн 2010.

  1. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Привет!

    Вот возникла проблемка, не знаю куда копнуть.

    Ситуация: есть база, в ней есть background agent (который в отдельном триде запускается).
    Агент там что-то процессит/генерит документы и т.д.
    Я хотел после генерации доков попросить его выполнить ws.ViewRefresh, дабы показать свежесгенеренные документы.
    Что бы не рефрешить ws, пока юзер работает с другими базами, в самом агенте я пытаюсь анализировать, что у меня в данный момент открыто.

    Ну агент негодует адово:
    то просто тупо фризиться, то кидает красный квадрат с unexpected handle, то nsd-шечку покажет.
    В основном это происходит, если начинаешь лазить по документам, сохранять их и т.д.

    Вся эта фигня происходит имеено в блоке определения текущей базы.
    Если его закомментить, то начинает работать железно, но рефрешить лишние разы, что бесит.
    ErrorHandler есть, но полчит как Исаев на допросе...

    Код агента примерно такой:
    Код (LotusScript):
    AgentSleep:  
    Sleep(SleepInterval)
    Sleeps = Sleeps + SleepInterval

    If Sleeps >= RefreshInterval Then
    Sleeps = 0

    If SOME_PROCESSING(Db) Then
    Dim RefreshWsLocal As Boolean
    RefreshWsLocal = False

    Dim ws As New NotesUIWorkspace
    Dim CurrUIDb As NotesUIDatabase
    Dim CurrDb As NotesDatabase

    If Not RefreshWsLocal Then
    Set CurrUIDb = ws.CurrentDatabase
    If CurrUIDb Is Nothing Then Goto RefreshTry

    Set CurrDb = CurrUIDb.Database
    If CurrDb Is Nothing Then Goto RefreshTry

    RefreshWsLocal = (CurrDb.Title = AgentDbTitle) 'сравнивает название текущей базы и базы, в которой крутиться агент.
    End If

    RefreshTry:              
    If RefreshWsLocal Then Call ws.ViewRefresh

    Set CurrDb = Nothing
    Set CurrUiDb = Nothing
    Set Ws = Nothing

    Goto AgentSleep
    End If
    Else
    Goto AgentSleep
    End If
    Эни айдиас?

    p.s. Сам знаю, что идея не очень хороша, но не хочется отказываться.
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Уважаемый, агент же бекендовый, к чему удивление? ;)
    А торкнуть из него другой агент, который обновит вид?
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну, бекендовый агент спокойненько может дёргать все ws-ные методы и проперти.
    Это не шедульный, а тот, у которого стоит галочка "Run in separated client thread"

    Вынес объявление ws наверх из цикла, вроде перестал негодовать, ещё тестирую.
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Dim ws As New NotesUIWorkspace
    переписывай через сесию и всё будет пахать
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Что через session?
    Получть ws через session? ;)
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Да, он иногда такое говорит, что фиг поймешь ))
     
  7. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Omh
    не использовать УИ для агента вообще - но это к слову
    а
    вот Set CurrUIDb = ws.CurrentDatabase я вот не помню где именно я это читал но и по опыту это запрещенный метод, для определения текущей базы использовать ТОЛЬКО через Ses.CurrentDatabes
     
  8. Omh

    Omh Lotus team
    Lotus team

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

    Тут никакие задние объекты не годятся.
    Это, кагбэ, условие задачи.

    Вроде получается, кстати, я отпишусь, если выстругаю...


    Понял, ща гляну через session.CurrentDatabase что даёт.
     
  9. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    есть ws.getcurrentdatabase
     
  10. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ради инфы: session.CurrentDatabase мне всегда возвращет базу, в которой крутиться агент.
    Что логично, там session инициализирован первой сторокой и не переиницализируется.
     
  11. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    это даже в справке написано, о чем собсно нам сообщила цитатой OKEN ;)

    Не понял, чем ты хотел нас удивить? ;)

    А при чем тут УИшная БД?
     
  12. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Как я понял, обновлять нужно только в том случае, если нужное представление является активным, т.е. с помощью ws.currentdatabase автор пытается выяснить активную в ws базу данных и, если она совпадает с бд агента, выполнить обновление. КМК сие либо нереализуемо, либо нужно курить другой бамбук.

    P.S. Может покурить в сторону ws.currentview?
     
  13. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Таки да, я был невнимателен к коду.

    Omh
    тогда юзай как Ленка сказала:
     
  14. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Описал правильно и сие реализуемо.
    Я смотрел на currentview - начинал ещё более оголотело кидать квадратами.
    Сейчас с накопленными знаниями посмотрю ещё разок.
    Через вьюшку даже лучше было бы...

    Своей тупостью :)
     
  15. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Оффтоп. Он не запрещённый. Просто был изначально написал для доступа к LND через OLE, т.е. с урезанным функционалом. Ничего страшного в нём нет, кроме того, что БД, полученная с UIDatabase ничего не возвратит в UnprocessedDocuments и т.п., что написано в хэлпе... Поэтому, чтобы разделить функционал и есть сейчас 2 метода: CurrentDatabase (для OLE или можно пользоваться ограниченным набором методов) и GetCurrentDatabase (для использования в LS). На практике использование и того и другого действительно редки, - только когда надо работать именно с объектом UIDatabase, а не с Database, полученной из неё; это уже просто традиция - использовать NS.CurrentDatabase.

    Объекты этого класса рекордсмены по красным окнам. Я бы не смотрел в ту сторону..

    P.S. Когда-то в агентах не срабатывал ws.ViewRefresh, поэтому делал сначало обновление бэкэндного объекта вьюхи (nv.Refresh), а затем уже ws.ViewRefresh.
     
  16. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    На моей практике, во многих случаях оно вообще не возвращает объект, или я не правильно его пользовал )
    А запретное оно для программеров - так им и говорят: "низзя тебе юзать это свойство" ))
     
  17. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Попробовал данный функционал в не так давно выложенной Omh базе http://codeby.net/ipb.html?s=&sh...st&p=171280
    Без проблем получаю фоновым агентом текущее открытое представление/базу (выводится в строку состояния), но если начинаю активно действовать в рабочей области (открывать другие базы/представления) то очень быстро получаю "серый квадрат". Так что уточняю, кмк, сие нереализуемо без риска уронить клиента (практически 100%). Можно, конечно, ещё и с winapi поиграться, но пусть уж лучше пользователи сами обновляют.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Допиленный код агента для любопытствующих</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Sub Initialize
    On Error Goto Errh
    Dim ws As New NotesUIWorkspace
    Dim uiview As NotesUIView
    Dim uiDoc As NotesUiDocument
    Dim Doc As NotesDocument
    Set uiDoc = ws.CurrentDocument
    Set Doc = uiDoc.Document
    Dim i As Integer
    Dim session As New NotesSession
    Start:
    Const MAX = 100
    If Doc Is Nothing Then Exit Sub
    If i >= MAX Then Exit Sub
    If Doc.IsUIDocOpen Then
    Dim Data As String
    Data = Doc.GetItemValue("Data")(0)
    Dim Record As String
    If i = MAX - 1 Then
    Record = "Всё, глаза отвалились!"
    Else
    Set uiview = ws.CurrentView
    If uiview Is Nothing Then
    Record = Cstr(Now) + ": uiview is nothing"
    Else
    Record = Cstr(Now) + " db.Name=" + uiview.View.Parent.Title + "; view.Name=" + uiview.View.Name
    End If
    End If
    Print Cstr(i) + ". " + Record
    i = i + 1
    Sleep(0.5)
    Goto Start
    End If
    Exit Sub
    errh:
    Msgbox Error & | in line | & Erl(), 64, |Lotus Notes (| & Lsi_info(2) & |)|
    Exit Sub
    End Sub
     
  18. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Наткнулся на интересную фичу — если представление пустое (нет документов), ws.CurrentView возвращает Nothing. Таким образом, если уважаемый Omh фоновым агентом заполняет изначально пустое представление (папку?) возникает проблема определения, что оно(она) имеют фокус.
     
  19. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    С "фокусом" в лотусе вообще беда.
     
  20. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Фокус-Лотус :)
     
Загрузка...
Похожие Темы - Background Agent кидается
  1. Dragon108
    Ответов:
    31
    Просмотров:
    5.755
  2. fedotxxl
    Ответов:
    20
    Просмотров:
    6.349
  3. alik86
    Ответов:
    22
    Просмотров:
    6.829
  4. ioni
    Ответов:
    3
    Просмотров:
    2.588
  5. Gottalent
    Ответов:
    0
    Просмотров:
    196

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