можно ли сделать прогресс-бар на клиенте?

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

  1. deeeman

    deeeman Well-Known Member

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

    можно ли сделать прогресс-бар на клиенте, если агент отрабатывает на сервере(запуск с клиента по кнопке с передачей ид)
    Код (LotusScript):
    Call a.RunOnServer(doc.NoteID)
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    вряд ли получится.
     
  3. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    ну а вообще какие то сигналы можно слать клиенту во время отработки серверных агентов?
     
  4. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    слать сигналы клиенту - врятли. но зато клиент может переодически спрашивать сервер: "кагдила? уже_готово? а_когда_будет готово?"
    подобным образом в вебе делают прогрессбар при аплоаде файлов.
    На уровне идеи:
    сервер может в процессе работы писать прогресс в документ, а клиент может переодически получать этот документ.
    для реализации хотелки в клиенте нужно запустить серверного агента так, чтоб клиент не "залип" до окончания работы агента.
    для этого можно создать background thread агента, в коде которого пнуть нужный нам серверный агент.
    на форму( или где там жмеца кнопка ) вешаем таймер, который переодически переполучает документ с сервера и вынимает оттуда % сделанной работы.
    P.S. кстати, насчет сигналов. сервер же может слать почту. чем не сигнал? :)
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    открывайте свинговое окно (на клиенте), открывайте порт (любой - какой позволено) на про слушку RMI
    с сервера дергайте клиента, в нужные моменты...
    вощем - всё стандартно (правда не для "родной" домины) ;)
     
  6. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    turumbay
    хорошая идея!!!
    теперь вопрос остается только такой:

    у меня в бэкграунте работает db.FTSearch
    вот он как то может выдать степень своей готовности?
    бывают базы до 50 Гб, и поиск иногда занимает до 15 мин
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    неуж-то трудно распарсить команду сервера sh ta ? ;)
    даже базу можно увидеть...
    а вот со "степенью" - облом будет, потому как домина сама её померять затруднится (попугаи неровные)
     
  8. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    никак. у db.FTSearch всего две степени готовности: "еще не готово" и "уже готово".
    хотя... спрофилируйте агента. есть подозрение, что основное время, как обычно, тратица не на поиск, а на перебор результатов поиска( обход коллекции ). если так - то %% готовности = %% считанных из коллекции документов.
     
  9. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    как это можно поймать? если это все внутри метода FTSearch делается?
     
  10. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    внутри ftsearch происходит колдунство, в результате которого мы получаем коллекцию документов - этот процесс нам неподвластен.
    но после ftsearch агент же делает что-то с этой коллекцией? ежели там putinfolder - тогда расслабьтесь, прогрессбар не реализуем.
    а если там идет перебор коллекции в цикле - тогда есть шанс, который заключается в том, что перебор займет больше времени, чем вызов ftsearch.
    еще раз: спрофилируйте агента, чтобы понять какая часть кода выполняется дольше всего.
    в declarations агента добавляем:<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">declarations</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Class SimpleTimer
    Private startTic As Long

    Sub new()
    Call restart()
    End Sub

    Public Sub restart()
    startTic = Getthreadinfo(6)        
    End Sub

    Public Function getSeconds() As Double
    getSeconds = (Getthreadinfo(6) - startTic) / Getthreadinfo(7)
    End Function

    Public Function getFormattedSeconds() As String
    getFormattedSeconds = Format$( getSeconds() , "##0.00")
    End Function

    Public Function getFormattedSecondsAndRestart() As String
    getFormattedSecondsAndRestart = getFormattedSeconds()
    Call restart()
    End Function
    End Class
    в начале агента(initialize) добавляем: Dim stimer As New SimpleTimer()
    перед вызовом ftSearch: messageBox "from start to ftsearch: " & stimer.getFormattedSecondsAndRestart()
    сразу после вызова ftSearch:messageBox "ftsearch: " & stimer.getFormattedSecondsAndRestart()
    перед выходом из агента: messageBox "from ftsearch to end: " & stimer.getFormattedSeconds()
    Далее смотреть выхлоп в консоли(log.nsf). Если основное время уходит на вызов ftsearch - следует расслабица и забыть о прогрессбаре.
     
  11. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    расслабился.... :)
     
  12. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    а почему? получить размер коллекции, азделить его на н частей и складывать по одному доку до каждой части и потм отсылать прогресс в тот же док (идея выше).
     
Загрузка...

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