|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Запускаю несколько экземпляров фокса. Каждый - это робот, записи обрабатывает, таскает туда сюда, считает .. и все такое. DOEVENTS стоят везде где можно.. но все равно скорость сервера катастрофически падает, хотя сами рОботы обрабатывают записи не чаще одного раза в секунду (inkey(1) между записями, потом правда пересчет - много чтения из таблиц, но пользователей тоже много и у них нет этой проблемы). В общем скорость падает необоснованно сильно.. Когда приложение одно - все летает, когда два - ползают оба. Что нужно сделать? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 10:13 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Timer есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 10:38 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEvDOEVENTS стоят везде где можно.. Зачем роботу DOEVENTS ? MaestroEvно все равно скорость сервера катастрофически падает Что есть "скорость сервера" ? расстояние преодолеваемое сервером в единицу времени? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 10:42 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Да.. Timer естественно есть.. В нем беда? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 10:46 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEvДа.. Timer естественно есть.. В нем беда? 1. Когда прога одна, то обращение к табличкам идёт без opportunistic lock, и операции успевают выполниться за время таймера 2. Когда два эеземпляра, интервал таймера не успевает выполнить все операции и происходит накопление событий Timer. Увеличь интервал вызова таймера. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 11:22 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
PaulWistУвеличь интервал вызова таймера. Полумера это. Долгоиграющий код запустится и опять лавина сработок таймера пойдет. Да и не всегда возможно увеличивать интервал. Я в таких случаях проверяю внутри таймера сколько прошло времени с прошлой сработки. Примерно так: Timer.Timer() Код: sql 1. 2. 3. 4. 5.
This.nPrevStart предварительно создать в Timer.Init() PS Теперь я понял зачем DOEVENTS, только он мало поможет, зато создаст тормоза и необъяснимые глюки. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 12:35 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Dima TPaulWistУвеличь интервал вызова таймера. Полумера это. Долгоиграющий код запустится и опять лавина сработок таймера пойдет. Да и не всегда возможно увеличивать интервал. ... Дык, ТС не озвучил, что его код делает и почему надо запускать таймер (хотя можно запустить виндовое задание) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 14:54 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
PaulWistДык, ТС не озвучил, что его код делает и почему надо запускать таймер (хотя можно запустить виндовое задание) как говориться "правильно заданный вопрос содержит половину ответа" Гадать не будем, захочет - сам напишет. С таймерами у многих проблемы потому что не знают как он реально работает. В хэлпе не упомянули что он может несколько раз подряд сработать, и даже сработать если на текущий момент остановлен. Это происходит потому что таймер только шлет сообщения в очередь виндовса с заданной периодичностью, а когда сама обработка сообщения произойдет - это зависит от того когда приложение освободиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 17:13 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Это мелкая программка - форма, висит и смотрит директории. И делает что-то с табличками в зависимости от того что пришло. На каждый магазин, (работаем в терминале) - висит одна такая программка. Когда стояли на разных серверах - все ок. Счас поставили на один сервак и все стало медленно, хотя сервак мощный. Увеличил время таймера. На самом деле програмок еще больше.. Есть еще фоксовские пересылщики фаликов и почта на фоксе.. В общем все на таймерах и куче мелких фоксовских програмок делающих все в зависимости от того что кому и куда пришло... Все работает шустро если каждая эта программка на одном компе. Надо попробовать их в разные терминальные сессии загнать.. Ведь нет же проблем с сотней пользователей фокса, а они все на этом же серваке... и у них тоже есть в программе таймеры. Я думал, мож настройка какая-то есть в виндосе, чтобы каждая програмка на сервере работала не мешая друг другу. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 18:02 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Dima TPaulWistДык, ТС не озвучил, что его код делает и почему надо запускать таймер (хотя можно запустить виндовое задание) как говориться "правильно заданный вопрос содержит половину ответа" Гадать не будем, захочет - сам напишет. С таймерами у многих проблемы потому что не знают как он реально работает. В хэлпе не упомянули что он может несколько раз подряд сработать, и даже сработать если на текущий момент остановлен. Это происходит потому что таймер только шлет сообщения в очередь виндовса с заданной периодичностью, а когда сама обработка сообщения произойдет - это зависит от того когда приложение освободиться. Упс.... То есть таймер отработал, а виндовс занят.. ждем, а таймер в это время еще раз в очередь сработал.. а как виндовс освободился - пошло выполнение кода по таймеру, и хоть мы таймер и отключили - вторая его сработка уже ждет нас в очереди и запускается?.. Ну это не страшно, таймер у меня лишь нажимает кнопки "обработка" и т.п. и отключает все кнопки и себя на форме пока не доделает.. Как доделает - включает кнопки и себя .. и если второй раз он уже в очереди сидит - то пусть сработает - нет проблем вроде.. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 18:08 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEvУпс.... То есть таймер отработал, а виндовс занят.. ждем Не виндовс а твоя прога. Таймером рулит виндовс. Если по простому, то прога дает команду виндовсу "извещай меня каждые X.XXX сек.", что виндовс и делает. Но это "извещение" это не запуск кода, а сообщение в очередь сообщений твоей проги. Подробнее тут, в середине "Алгоритм выборки сообщений из очереди потока" Если ты своевременно не обрабатываешь сообщения они копятся в очереди и дальше кучей обрабатываются. Например: поставил ты таймер раз в секунду и запустил расчет на 10 секунд, после его отработки обработались те 10 сообщений которые накопились за это время, т.е. 10 раз подряд (без пауз) запустился метод Timer(). Причем обработались они подряд без всяких пауз, т.к. фокс их только извлекает из очереди сообщений. Тоже с отключением таймера: если на 9-й секунде ты его выключишь, то предыдущие 8 уже в очереди на обработку и никуда не исчезнут, т.е. будут в итоге обработаны. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 18:33 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEvНу это не страшно, таймер у меня лишь нажимает кнопки "обработка" и т.п. и отключает все кнопки и себя на форме пока не доделает.. Если все не страшно то зачем топик тогда создал? Таймер "нажмет" любую кнопку, в т.ч. отключенную. Проблема в чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 19:30 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Dima TMaestroEvУпс.... То есть таймер отработал, а виндовс занят.. ждем Не виндовс а твоя прога. Таймером рулит виндовс. Если по простому, то прога дает команду виндовсу "извещай меня каждые X.XXX сек.", что виндовс и делает. Но это "извещение" это не запуск кода, а сообщение в очередь сообщений твоей проги. Подробнее тут, в середине "Алгоритм выборки сообщений из очереди потока" Если ты своевременно не обрабатываешь сообщения они копятся в очереди и дальше кучей обрабатываются. Например: поставил ты таймер раз в секунду и запустил расчет на 10 секунд, после его отработки обработались те 10 сообщений которые накопились за это время, т.е. 10 раз подряд (без пауз) запустился метод Timer(). Причем обработались они подряд без всяких пауз, т.к. фокс их только извлекает из очереди сообщений. Тоже с отключением таймера: если на 9-й секунде ты его выключишь, то предыдущие 8 уже в очереди на обработку и никуда не исчезнут, т.е. будут в итоге обработаны. Странно но нет этого.. Внутри кода таймера, первое что я делаю, отключаю таймер. И прога ничего не ждет как только запустилась. И по кнопкам тоже.. Я ж проверяю, активна кнопка или нет и могу ли я ее кликнуть..... А топик завел, потому что хотел узнать, можно ли сделать так, чтобы в одной терминальной сессии запущенные экземпляры фокса работали так же шустро, как запущенные в разных сессиях. Выяснилось, что в разных сессиях они не тормозят друг друга, но неудобно иметь кучу сессий... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2013, 02:02 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEvСтранно но нет этого.. Внутри кода таймера, первое что я делаю, отключаю таймер. И прога ничего не ждет как только запустилась. И по кнопкам тоже.. Я ж проверяю, активна кнопка или нет и могу ли я ее кликнуть..... Сделай запись в лог о всех действиях таймеров и посмотри так ли все происходит как ты думаешь. MaestroEvА топик завел, потому что хотел узнать, можно ли сделать так, чтобы в одной терминальной сессии запущенные экземпляры фокса работали так же шустро, как запущенные в разных сессиях. Выяснилось, что в разных сессиях они не тормозят друг друга, но неудобно иметь кучу сессий... Неверный вывод. Для производительности нет разницы в одной терминальной сессии или в разных запущены проги (если ты сам не прописал их взаимодействие меж собой). Ищи другие причины тормозов. Для начала определись что тормозит: процессор или файловый ввод/вывод. Диспетчером задач посмотри на сколько твои роботы процессор грузят. Логи пиши с указанием времени, потом ищи наиболее тормозное место в коде. Дальше с ним разбирайся. Может тормоза от лишнего inkey(1) :) Есть ощутимая разница когда один процесс работает с таблицей или несколько ("работает" значит держит открытой). Особенно заметно если работа по сети. Т.е. открыв по сети одну и туже DBF в двух прогах получишь замедление чтения/записи до 10 раз по сравнению с одной прогой. По разным сессиям есть смысл разносить когда несколько прог одновременно используют внешние приложения. Например был случай когда запускались две проги для генерации экселевских файлов (разных), эксель периодически зависал и одну из прог завешивал. Начал запускать под разными ползователями - проблема исчезла. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2013, 07:29 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2013, 05:07 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEv... Выяснилось, что в разных сессиях они не тормозят друг друга, но неудобно иметь кучу сессий... VFP itself - это старый добрый COM+ object и скорее всего не многопоточный. Отсюда открытые в одной сессии объекты могут мешать друг другу борясь за одинаковые ресурсы. Когда же Вы открывете VFP объект в разных терминальный сессиях - Windows создает Вам изолированные среды исполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2013, 01:25 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Dima T ... Например был случай когда запускались две проги для генерации экселевских файлов (разных), эксель периодически зависал и одну из прог завешивал. Начал запускать под разными ползователями - проблема исчезла. Запускание Excel в таком виде не рекомендуется так как он использует профайлы клиента для своих временных файлов ресурсов. Microsoft рекомендует использовать другую архитектуру для того, что Вы описали... но только не использование самого Excel :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2013, 01:30 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Sergey ChVFP itself - это старый добрый COM+ object и скорее всего не многопоточный. Отсюда открытые в одной сессии объекты могут мешать друг другу борясь за одинаковые ресурсы. Не согласен. За какие конкретно ресурсы могут бороться два фоксовых приложения в одной пользовательской сессии? Поверю, если увижу конкретный тест это подтверждающий. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2013, 09:57 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEv, Знание не сваливается с потолка, но получается из опыта. Набросок опытной схемы приведён в конце сообщения. Для его запуска служит командник из 3 строк start vfp9 DoTimer.fxp 'Timer1' start vfp9 DoTimer.fxp 'Timer2' start vfp9 DoTimer.fxp 'Timer3' Результат запуска. Индикация срабатывания таймера в каждом каждом приложении проходит своевременно, но окна каждого приложения реагируют на перетаскивание левой кнопкой мыши за строку заголовка окна с большой задержкой. И эта задержка ощущается, пока хоть в одном окне из трёх выполняется таймер. Чтоб получить больше полезных сведений, придётся вставить в опытную схему больше реальных подробностей. Возможно, есть смысл оформить приложение как exe-файл. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2013, 13:59 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Rostislav D. Kudryashov, увы, при оформлении приложений как exe-файлы интерактивная реакция их окон не ускоряется. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2013, 14:10 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEv, а вот замена "SleepSDK(3000)" в процедуре Timer() на Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2013, 14:32 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEv, Окна приложений стали идеально интерактивно реагировать после следующего переоформления класса FatTimer. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2013, 15:09 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
MaestroEv, вот ведь оказия! Если при самоостановке, когда в Timer() выполняется THIS.Interval=0 или THIS.Enabled=.F., выполняется также и DOEVENTS, то все застрявшие из-за выполнения таймера большего, чем Interval, вызовы сразу гасятся. Их отсечка через LastWorked становится ненужной. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 12:39 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Rostislav D. KudryashovMaestroEv, а вот замена "SleepSDK(3000)" в процедуре Timer() на Код: plaintext 1. 2. 3. 4.
READ EVENTS чем не устроил? Зачем этот велосипед с квадратными колесами? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 15:25 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#18+
Dima T, вообще-то READ EVENTS меня устроил, но расположил я его не в том месте, которое ты мне процитировал, а в запускающей PROCEDURE DoTimer(). Из текста примера ты должен был заметить, что по нажатию Ctrl+F12 выполняется CLEAR EVENTS. А процитированный тобой фрагмент содержит не "квадратные колёса", а DOEVENTS, необходимый для гашения вызовов Timer(), застрявших в Windows из-за времени обработки события SECONDS() + 3, большего чем FatTimer.Intreval = 1000 (и тем более = 100). Кроме того, я предполагаю, что DOEVENTS ускоряют интерактивную реакцию окна приложения. Хотя, в этом плане, мне не всё так очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2013, 15:40 |
|
Несколько экземпляров фокса на сервере
|
|||
---|---|---|---|
#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?all=1&fid=41&tid=1582846]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
153ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 276ms |
0 / 0 |