powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Несколько экземпляров фокса на сервере
6 сообщений из 31, страница 2 из 2
Несколько экземпляров фокса на сервере
    #38459496
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovА процитированный тобой фрагмент содержит не "квадратные колёса", а DOEVENTS, необходимый для гашения вызовов Timer(), застрявших в Windows из-за времени обработки события SECONDS() + 3, большего чем FatTimer.Intreval = 1000 (и тем более = 100).
Это читал?
HELPSECONDS( ) Function
Returns the number of seconds that have elapsed since midnight.
Твой цикл станет бесконечным если запустится в период с 23:59:57 до 00:00:00

Во-вторых пустой цикл - это пустая трата процессорного времени. Оно конечно полезно если в помещении холодно и надо процессор в качестве обогревателя задействовать.

И никаких ускорений по сравнению с READ EVENTS это не даст. И вставлять его сюда не надо, надо заменить обычным таймером с интервалом 3 секунды. В общем ты изобрел корявую паузу в 3 секунды.
Я выше ссылку давал на книгу, там подробно описано как реально устроена обработка сообщений в виндовсе.
...
Рейтинг: 0 / 0
Несколько экземпляров фокса на сервере
    #38459548
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ну ты чудак. Испытательную схему не надо примерять к бесконечности. На то Ctrl+F12 в схеме и предусмотрен. А в книге даже если и описана "реальность", то результаты из опытной схемы никак нельзя игнорировать. Если не веришь, тому что я здесь уже написал, - проверь своими руками. Эта опытная схема даёт результаты дополнительно к твоей книге.
Если ж ты просто не вчитался по рассеяности, повторю ещё раз. При _VFP.AutoYield = .T. (by default) подача DOEVENTS сразу после FatTimer.Enabled = .F. очищает очередь вызовов таймера, застрявших в Windows из-за времени исполнения таймера большего, чем FatTimer.Interval. Я проверил это на схеме, вставив DOEVENTS в FatTimer.Timer() сразу после THIS.Enabled = .F.
А уж если здесь уместно обсудить все особенности фоксовского таймера, то одна его подлянка состоит в том, что при плотном захвате приложением процессора без промежуточных DOEVENTS дождаться очередного срабатывания таймера проблематично.
Эту проблему решает прямое использование функций SetTimer()/KillTimer() из User32.lib. Описано в http://hermantan.blogspot.ru/2006/09/more-reliable-timer-unstoppable.html
...
Рейтинг: 0 / 0
Несколько экземпляров фокса на сервере
    #38459574
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, и ещё один казус. Ты мне пеняешь что Dima TИ никаких ускорений по сравнению с READ EVENTS это не даст.. Т.е. использование DOEVENTS. Это выглядит просто безумием каким-то. Нигде я не писал, что DOEVENTS я использую вместо READ EVENTS. И даже в одном из ответов тебе специально указал, что READ EVENTS у меня стоит на своём месте. Может ты всё-тки отделаешься от этого своего заблуждения и взглянешь на то, что я предложил для обсуждения?

Проблема приложений с плотным фоновым использованием процессора, запускаемым через таймер, в том, что такое приложение начинает плохо реагировать на сигнал оператора через контролы на форме. Команда DOEVENTS даёт Фоксу шанс откликнуться на сигналы оператора. Если фоновое вычисление не может слишком часто давать DOEVENTS, их можно посылать при включении Timer(). Но и сам Timer() может застрять из-за свехнормативной продолжительности его отработки фоновым вычислением.

У меня в одной задаче была такая реализация. Таймер запускается строго по расписанию и запускает фоновое вычисление посылкой KEYBOARD (Нечто). После завершения таймера по ON KEY LABEL эта клавишная посылка запускает фоновое вычисление. Следующее включение таймера проверяет, не надо ли повторить фоновый запуск и т.д.
А чтобы давать дышать интерактивному интерфейсу на форме, таймер реализуется через WinAPI SetTimer() с частотой 0.1 сек для достаточно частой и регулярной подачи DOEVENTS. Фоновый расчёт т.о. освобождается от обязанности слать перестраховочные DOEVENTS.
...
Рейтинг: 0 / 0
Несколько экземпляров фокса на сервере
    #38459584
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashov, в последнем абзаце от 20:57 следует читать:
После завершения таймера эта клавишная посылка по ON KEY LABEL запускает фоновое вычисление.
...
Рейтинг: 0 / 0
Несколько экземпляров фокса на сервере
    #38459670
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashov, а ведь я погорячился. Необходимость DOEVENTS в фоновом счёте не отменяется использованием безотказно запускающегося таймера на основе WinAPI SetTimer(). Эта реализация у меня была давно и в DCOM-сервере, где интерактивность не играла роли. Так что в следующем опытном коде только наличие DOEVENTS в цикле внутри PROCEDURE BackGround() обеспечивает интерактивную реакцию пробной формы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
PROCEDURE DoBack(m.TimerName_yc)
LOCAL m.tmr_lo, m.frm_lo
CLEAR
m.tmr_lo = NEWOBJECT ('FatTimer')
IF PCOUNT () > 0
  ? 'PCOUNT', PCOUNT()
  m.tmr_lo.ObjName = m.TimerName_yc
ENDIF
PUBLIC m.Busy_gl, m.Stop_gl
STORE .F. TO m.Busy_gl, m.Stop_gl
m.tmr_lo.Enabled = .T.
? 'Ctrl+F12 for CLEAR EVENTS'
? TIME()
ON KEY LABEL CTRL+F12 DO StopDo
m.frm_lo = NEWOBJECT ('MyForm')
m.frm_lo.Left = _SCREEN.Width / 2
m.frm_lo.Visible = .T.
READ EVENTS
? TIME()
ON KEY LABEL CTRL+F12
ENDPROC && DoBack

PROCEDURE StopDo
ON KEY LABEL CTRL+F12
m.Stop_gl = .T.
CLEAR EVENTS
ENDPROC && StopDo

DEFINE CLASS FatTimer AS Timer
Interval = 100
Counter = 0
ObjName = 'FatTimer'

PROCEDURE Timer
*DOEVENTS
ACTIVATE SCREEN
IF NOT THIS.Enabled
  ? TIME(), STR(THIS.Counter,2), THIS.Enabled
  RETURN
ENDIF
? TIME(), STR(THIS.Counter,2), THIS.Enabled, THIS.ObjName
IF THIS.Counter < 99
  IF NOT m.Busy_gl
    THIS.Counter = THIS.Counter + 1
    ON KEY LABEL Ctrl+F11 DO BackGround
    KEYBOARD '{Ctrl+F11}' CLEAR && PLAIN
  ENDIF
ELSE
  THIS.Enabled = .F.
  ? TIME(), 'Stop', '', THIS.ObjName
  DOEVENTS
ENDIF
?? '', TIME(), 'FatTimer'
ENDPROC && Timer

ENDDEFINE && FatTimer

PROCEDURE BackGround
ON KEY LABEL Ctrl+F11
m.Busy_gl = .T.
ACTIVATE SCREEN
? TIME(), 'Back ini'
LOCAL m.StopTime_ln
m.StopTime_ln = SECONDS () + 3
DO WHILE SECONDS() < m.StopTime_ln AND NOT m.Stop_gl
  DOEVENTS
ENDDO
ACTIVATE SCREEN
?? '', TIME(), 'Back fin'
m.Busy_gl = .F.
ENDPROC && BackGround

DEFINE CLASS MyForm AS Form
ENDDEFINE && MyForm
...
Рейтинг: 0 / 0
Несколько экземпляров фокса на сервере
    #38460982
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovRostislav D. Kudryashov, а ведь я погорячился.
Умиляет твоя способность вести диалог с самим собой :)

Rostislav D. KudryashovЭта реализация у меня была давно и в DCOM-сервере
По моему ты там нашел какой-то обходной маневр трудноразрешимой проблемы и по старой памяти выдаешь тут его за единственно правильный стандарт. Про DCOM-сервер тут никто не говорил.
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Несколько экземпляров фокса на сервере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]