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

  • Автор темы deeeman
  • Дата начала
D

deeeman

Привет всем!!!

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

deeeman

ну а вообще какие то сигналы можно слать клиенту во время отработки серверных агентов?
 
T

turumbay

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
открывайте свинговое окно (на клиенте), открывайте порт (любой - какой позволено) на про слушку RMI
с сервера дергайте клиента, в нужные моменты...
вощем - всё стандартно (правда не для "родной" домины) ;)
 
D

deeeman

turumbay
хорошая идея!!!
теперь вопрос остается только такой:

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
неуж-то трудно распарсить команду сервера sh ta ? ;)
даже базу можно увидеть...
а вот со "степенью" - облом будет, потому как домина сама её померять затруднится (попугаи неровные)
 
T

turumbay

у меня в бэкграунте работает db.FTSearch
вот он как то может выдать степень своей готовности?
никак. у db.FTSearch всего две степени готовности: "еще не готово" и "уже готово".
хотя... спрофилируйте агента. есть подозрение, что основное время, как обычно, тратица не на поиск, а на перебор результатов поиска( обход коллекции ). если так - то %% готовности = %% считанных из коллекции документов.
 
D

deeeman

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

как это можно поймать? если это все внутри метода FTSearch делается?
 
T

turumbay

как это можно поймать? если это все внутри метода FTSearch делается?
внутри 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">
Код:
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 - следует расслабица и забыть о прогрессбаре.
 
X

Xalet

ежели там putinfolder - тогда расслабьтесь, прогрессбар не реализуем.
а почему? получить размер коллекции, азделить его на н частей и складывать по одному доку до каждой части и потм отсылать прогресс в тот же док (идея выше).
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!