Секундомер

Тема в разделе "Lotus - Программирование", создана пользователем Serduko, 31 янв 2013.

  1. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Есть база для проведения тестов, срок сдачи тестов ограничен временем. Как лучше реализовать отображение времени оставшегося для сдачи теста?
     
  2. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Два варианта в голову лезут.
    1. Агентом каждые 5 минут пробегаться по документам и вычислять оставшееся время
    2. Агентом каждые 5 минут в notes.ini перезаписывать текущее время, получать его в столбце вьюшки @Environment("CurrentTime")

    Первый, наверное лучше, особенно, если перебирать не все документы, а брать коллекцию только из тех, которые еще не просрочены. Во втором варианте, по-моему надо каждый раз перестраивать индекс вьюшки, хотя могу ошибаться.
     
  3. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Если нужно только визуальное отображение на форме то JavaScript должен прекрасно с этим справится.
     
  4. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Почитай в хелпе про NotesTimer и пример посмотри.
     
  5. yerke

    yerke Well-Known Member

    Регистрация:
    28 авг 2007
    Сообщения:
    392
    Симпатии:
    0
    + таймером бери время с сервака так как
    у меня были студенты, которые крутили время на компе
     
  6. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    таймером запускать агент :)
     
  7. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    См. тему Background. Внутри агента можно брать серверное время, допустим раз в 10 секунд.
     
  8. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    А каким образом брать время с сервера? На сколько точный этот NotesTime, у меня с интервалом 1 сек в течение 30 сек опоздал на 5?
     
  9. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Serduko
    а потому что не надо пользоваться этим таймером для отчета времени, им надо пользоваться для инициализация скрипта который получает серверное время.
    получать время можно агентом, например так @Now( flags ; serverNames )
     
  10. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Поиск что ли перестал работать?
    Создайте документ в БД (она на сервере ж находится?) и возьмите дату создания. @Now(flags; serverNames) глючит, об этом писали здесь, ищите.

    Добавлено:
    Это именно "убегание" времени, а не расхождение времени между клиентом и сервером?
     
  11. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Serduko
    Ещё подумал... Достаточно первый раз создать документ и взять дату и время, а затем просто прибавлять по секунде, т.к. секунда прибавляется, что на клиенте, что на сервере одинаково ;)
    Время вперёд убегает потому, что при создании дока UNID генерится на определённую секунду, а если до создаётся в пределах той же секунды, то чтобы UNID для него был уникальным, он рассчитывается по следующей секунде. Об этом было подробно когда-то на форуме Интертраста.
    Лучше, чтобы прибавлять >= 1 секунды, тогда время убегать не должно. Но иногда всё-таки будет, т.к. на сервере/клиентах могут работать другие агенты/люди, которые могут в то же время создавать документы.
     
  12. yerke

    yerke Well-Known Member

    Регистрация:
    28 авг 2007
    Сообщения:
    392
    Симпатии:
    0
    to author of post:

    еще не забудь при использовании NotesTimer-а
    таймер останавливается, если на документе появится диалоговое окно, допустим при открытии свойств дока.
    поэтому разумнее будет

    1) запомнить серверное время, когда начался тест, и скинуть его в NotesdateTime
    2) потом каждый раз NotesTimer-ом получать разницу в секундах между исходным временем и текущем
    3) если эти полученные секунды превышают или равны, отведенному времени, автоматом останавливаешь тест.
     
  13. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    С сервера время брать не обязательно.
    startTic = Getthreadinfo(6) берет "тики" с сотворения мира и они не меняются при изменении времени в операционке.

    Декларируйте startTic глобально, вычисляйте его, например, в PostOpen и используйте как опорное.

    И потом, лучше использовать JS:
    Например на "кнопочках" - в OnLoad нажимаете программно кнопочку MyClock
    window.document.forms[0].MyClock.click()
    а кнопочка MyClock нажимает саму себя с интервалом в 1сек. {setInterval("window.document.forms[0].MyClock.click()",1000)}, корректирует значение startTic, выводит значение времени в какое-нибудь поле для показа и проверяет не истекло ли время (с соответствующими действиями).

    Если хочется в LS, то нажимаем на кнопочку например так:
    Dim ws As New NotesUIWorkspace
    Call ws.URLOpen( "java script: document.forms[0].MyClock.click();" )
     
  14. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Спасибо всем, я реализовал в диалоге, примерно так (конечно код сыроват, все делалось впопыхах, но аттестация прошла успешно, теперь можно спокойно дорабатывать базу):

    Код (LotusScript):
    Sub StartExam(StartForm As NotesDocument)
    Dim ws As New NotesUIWorkspace
    Dim Qdoc As NotesDocument
    Dim Adoc As NotesDocument
    Dim NextAdoc As NotesDocument

    If Len(CStr(SectionDoc.SectionTime(0))) <> 0 Then
    If SectionDoc.SectionTime(0) <> 0 Then
    MaxTime = SectionDoc.SectionTime(0)
    startTime = Now
    elapsedTime = CDat(0)
    Set elapsedTimer = New NotesTimer(1, "Время сдачи раздела")
    On Event Alarm From elapsedTimer Call elapsedTimerHandler
    End If
    End If

    Set Qdoc = GetQuestionDoc(0)
    If Qdoc Is Nothing Then Exit Sub
    Set Adoc = GetAnswerDoc(Qdoc, "", StartForm.UserUN(0))
    NextAnswer:
    Adoc.OpenedInDialog = 1
    If elapsedTimer.Enabled Then Adoc.TimeLeft = GetRemainingTime
    If ws.DialogBox (Adoc.Form(0), True, True, True, False, False, False, "Вопрос №" + CStr(Adoc.QuestionIndex(0)),_
    Adoc, False, True) Then
    ...
    Код (LotusScript):
    Function GetRemainingTime As Integer
    If elapsedTime = CDat(0) Then
    GetRemainingTime = MaxTime
    Else
    GetRemainingTime = MaxTime - CInt(Format(elapsedTime - startTime,"nn"))
    End If
    End Function
    Код (LotusScript):
    Sub elapsedTimerHandler(Source As NotesTimer)
    Dim temp As Variant
    temp = Evaluate("@Now([ServerTime] : [LocalTimeOnError]; @ServerName)")
    elapsedTime = temp(0)
    End Sub
     
Загрузка...
Похожие Темы - Секундомер
  1. MisterJohn
    Ответов:
    0
    Просмотров:
    1.414
  2. DarkVss
    Ответов:
    2
    Просмотров:
    1.525

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