|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
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 секунды. Я выше ссылку давал на книгу, там подробно описано как реально устроена обработка сообщений в виндовсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 19:19 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 20:29 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 20:57 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Rostislav D. Kudryashov, в последнем абзаце от 20:57 следует читать: После завершения таймера эта клавишная посылка по ON KEY LABEL запускает фоновое вычисление. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 21:07 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 23:29 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Rostislav D. KudryashovRostislav D. Kudryashov, а ведь я погорячился. Умиляет твоя способность вести диалог с самим собой :) Rostislav D. KudryashovЭта реализация у меня была давно и в DCOM-сервере По моему ты там нашел какой-то обходной маневр трудноразрешимой проблемы и по старой памяти выдаешь тут его за единственно правильный стандарт. Про DCOM-сервер тут никто не говорил. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2013, 19:28 |
|
|
start [/forum/topic.php?fid=41&msg=38459548&tid=1582846]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 276ms |
0 / 0 |