Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Несколько экземпляров фокса на сервере / 25 сообщений из 31, страница 1 из 2
06.11.2013, 10:13
    #38454026
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Запускаю несколько экземпляров фокса. Каждый - это робот, записи обрабатывает, таскает туда сюда, считает .. и все такое. DOEVENTS стоят везде где можно.. но все равно скорость сервера катастрофически падает, хотя сами рОботы обрабатывают записи не чаще одного раза в секунду (inkey(1) между записями, потом правда пересчет - много чтения из таблиц, но пользователей тоже много и у них нет этой проблемы). В общем скорость падает необоснованно сильно.. Когда приложение одно - все летает, когда два - ползают оба.

Что нужно сделать? Спасибо.
...
Рейтинг: 0 / 0
06.11.2013, 10:38
    #38454059
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Timer есть?
...
Рейтинг: 0 / 0
06.11.2013, 10:42
    #38454063
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEvDOEVENTS стоят везде где можно..
Зачем роботу DOEVENTS ?
MaestroEvно все равно скорость сервера катастрофически падает
Что есть "скорость сервера" ? расстояние преодолеваемое сервером в единицу времени? ))
...
Рейтинг: 0 / 0
06.11.2013, 10:46
    #38454072
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Да.. Timer естественно есть.. В нем беда?
...
Рейтинг: 0 / 0
06.11.2013, 11:22
    #38454146
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEvДа.. Timer естественно есть.. В нем беда?

1. Когда прога одна, то обращение к табличкам идёт без opportunistic lock, и операции успевают выполниться за время таймера

2. Когда два эеземпляра, интервал таймера не успевает выполнить все операции и происходит накопление событий Timer.

Увеличь интервал вызова таймера.
...
Рейтинг: 0 / 0
06.11.2013, 12:35
    #38454295
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
PaulWistУвеличь интервал вызова таймера.
Полумера это. Долгоиграющий код запустится и опять лавина сработок таймера пойдет. Да и не всегда возможно увеличивать интервал.

Я в таких случаях проверяю внутри таймера сколько прошло времени с прошлой сработки. Примерно так:
Timer.Timer()
Код: sql
1.
2.
3.
4.
5.
if seconds() > This.nPrevStart and This.Interval > (seconds() - This.nPrevStart) * 1000 + 20
   return
endif
This.nPrevStart = seconds()
... тут полезный код


This.nPrevStart предварительно создать в Timer.Init()

PS Теперь я понял зачем DOEVENTS, только он мало поможет, зато создаст тормоза и необъяснимые глюки.
...
Рейтинг: 0 / 0
06.11.2013, 14:54
    #38454597
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Dima TPaulWistУвеличь интервал вызова таймера.
Полумера это. Долгоиграющий код запустится и опять лавина сработок таймера пойдет. Да и не всегда возможно увеличивать интервал.
...

Дык, ТС не озвучил, что его код делает и почему надо запускать таймер (хотя можно запустить виндовое задание)
...
Рейтинг: 0 / 0
06.11.2013, 17:13
    #38454879
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
PaulWistДык, ТС не озвучил, что его код делает и почему надо запускать таймер (хотя можно запустить виндовое задание)
как говориться "правильно заданный вопрос содержит половину ответа"

Гадать не будем, захочет - сам напишет.

С таймерами у многих проблемы потому что не знают как он реально работает. В хэлпе не упомянули что он может несколько раз подряд сработать, и даже сработать если на текущий момент остановлен. Это происходит потому что таймер только шлет сообщения в очередь виндовса с заданной периодичностью, а когда сама обработка сообщения произойдет - это зависит от того когда приложение освободиться.
...
Рейтинг: 0 / 0
06.11.2013, 18:02
    #38454990
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Это мелкая программка - форма, висит и смотрит директории. И делает что-то с табличками в зависимости от того что пришло. На каждый магазин, (работаем в терминале) - висит одна такая программка. Когда стояли на разных серверах - все ок. Счас поставили на один сервак и все стало медленно, хотя сервак мощный.

Увеличил время таймера. На самом деле програмок еще больше.. Есть еще фоксовские пересылщики фаликов и почта на фоксе.. В общем все на таймерах и куче мелких фоксовских програмок делающих все в зависимости от того что кому и куда пришло...

Все работает шустро если каждая эта программка на одном компе. Надо попробовать их в разные терминальные сессии загнать.. Ведь нет же проблем с сотней пользователей фокса, а они все на этом же серваке... и у них тоже есть в программе таймеры. Я думал, мож настройка какая-то есть в виндосе, чтобы каждая програмка на сервере работала не мешая друг другу.

Спасибо.
...
Рейтинг: 0 / 0
06.11.2013, 18:08
    #38455003
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Dima TPaulWistДык, ТС не озвучил, что его код делает и почему надо запускать таймер (хотя можно запустить виндовое задание)
как говориться "правильно заданный вопрос содержит половину ответа"

Гадать не будем, захочет - сам напишет.

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

Упс.... То есть таймер отработал, а виндовс занят.. ждем, а таймер в это время еще раз в очередь сработал.. а как виндовс освободился - пошло выполнение кода по таймеру, и хоть мы таймер и отключили - вторая его сработка уже ждет нас в очереди и запускается?..

Ну это не страшно, таймер у меня лишь нажимает кнопки "обработка" и т.п. и отключает все кнопки и себя на форме пока не доделает..
Как доделает - включает кнопки и себя .. и если второй раз он уже в очереди сидит - то пусть сработает - нет проблем вроде..
...
Рейтинг: 0 / 0
06.11.2013, 18:33
    #38455048
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEvУпс.... То есть таймер отработал, а виндовс занят.. ждем
Не виндовс а твоя прога. Таймером рулит виндовс. Если по простому, то прога дает команду виндовсу "извещай меня каждые X.XXX сек.", что виндовс и делает.
Но это "извещение" это не запуск кода, а сообщение в очередь сообщений твоей проги. Подробнее тут, в середине "Алгоритм выборки сообщений из очереди потока"
Если ты своевременно не обрабатываешь сообщения они копятся в очереди и дальше кучей обрабатываются.

Например: поставил ты таймер раз в секунду и запустил расчет на 10 секунд, после его отработки обработались те 10 сообщений которые накопились за это время, т.е. 10 раз подряд (без пауз) запустился метод Timer(). Причем обработались они подряд без всяких пауз, т.к. фокс их только извлекает из очереди сообщений. Тоже с отключением таймера: если на 9-й секунде ты его выключишь, то предыдущие 8 уже в очереди на обработку и никуда не исчезнут, т.е. будут в итоге обработаны.
...
Рейтинг: 0 / 0
06.11.2013, 19:30
    #38455104
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEvНу это не страшно, таймер у меня лишь нажимает кнопки "обработка" и т.п. и отключает все кнопки и себя на форме пока не доделает..
Если все не страшно то зачем топик тогда создал? Таймер "нажмет" любую кнопку, в т.ч. отключенную.
Проблема в чем?
...
Рейтинг: 0 / 0
07.11.2013, 02:02
    #38455420
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Dima TMaestroEvУпс.... То есть таймер отработал, а виндовс занят.. ждем
Не виндовс а твоя прога. Таймером рулит виндовс. Если по простому, то прога дает команду виндовсу "извещай меня каждые X.XXX сек.", что виндовс и делает.
Но это "извещение" это не запуск кода, а сообщение в очередь сообщений твоей проги. Подробнее тут, в середине "Алгоритм выборки сообщений из очереди потока"
Если ты своевременно не обрабатываешь сообщения они копятся в очереди и дальше кучей обрабатываются.

Например: поставил ты таймер раз в секунду и запустил расчет на 10 секунд, после его отработки обработались те 10 сообщений которые накопились за это время, т.е. 10 раз подряд (без пауз) запустился метод Timer(). Причем обработались они подряд без всяких пауз, т.к. фокс их только извлекает из очереди сообщений. Тоже с отключением таймера: если на 9-й секунде ты его выключишь, то предыдущие 8 уже в очереди на обработку и никуда не исчезнут, т.е. будут в итоге обработаны.

Странно но нет этого.. Внутри кода таймера, первое что я делаю, отключаю таймер. И прога ничего не ждет как только запустилась.

И по кнопкам тоже.. Я ж проверяю, активна кнопка или нет и могу ли я ее кликнуть.....

А топик завел, потому что хотел узнать, можно ли сделать так, чтобы в одной терминальной сессии запущенные экземпляры фокса работали так же шустро, как запущенные в разных сессиях. Выяснилось, что в разных сессиях они не тормозят друг друга, но неудобно иметь кучу сессий...
...
Рейтинг: 0 / 0
07.11.2013, 07:29
    #38455484
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEvСтранно но нет этого.. Внутри кода таймера, первое что я делаю, отключаю таймер. И прога ничего не ждет как только запустилась.
И по кнопкам тоже.. Я ж проверяю, активна кнопка или нет и могу ли я ее кликнуть.....
Сделай запись в лог о всех действиях таймеров и посмотри так ли все происходит как ты думаешь.

MaestroEvА топик завел, потому что хотел узнать, можно ли сделать так, чтобы в одной терминальной сессии запущенные экземпляры фокса работали так же шустро, как запущенные в разных сессиях. Выяснилось, что в разных сессиях они не тормозят друг друга, но неудобно иметь кучу сессий...
Неверный вывод. Для производительности нет разницы в одной терминальной сессии или в разных запущены проги (если ты сам не прописал их взаимодействие меж собой). Ищи другие причины тормозов.
Для начала определись что тормозит: процессор или файловый ввод/вывод. Диспетчером задач посмотри на сколько твои роботы процессор грузят. Логи пиши с указанием времени, потом ищи наиболее тормозное место в коде. Дальше с ним разбирайся. Может тормоза от лишнего inkey(1) :)

Есть ощутимая разница когда один процесс работает с таблицей или несколько ("работает" значит держит открытой). Особенно заметно если работа по сети. Т.е. открыв по сети одну и туже DBF в двух прогах получишь замедление чтения/записи до 10 раз по сравнению с одной прогой.

По разным сессиям есть смысл разносить когда несколько прог одновременно используют внешние приложения. Например был случай когда запускались две проги для генерации экселевских файлов (разных), эксель периодически зависал и одну из прог завешивал. Начал запускать под разными ползователями - проблема исчезла.
...
Рейтинг: 0 / 0
08.11.2013, 05:07
    #38457285
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Спасибо.
...
Рейтинг: 0 / 0
09.11.2013, 01:25
    #38458568
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEv... Выяснилось, что в разных сессиях они не тормозят друг друга, но неудобно иметь кучу сессий...
VFP itself - это старый добрый COM+ object и скорее всего не многопоточный. Отсюда открытые в одной сессии объекты могут мешать друг другу борясь за одинаковые ресурсы. Когда же Вы открывете VFP объект в разных терминальный сессиях - Windows создает Вам изолированные среды исполнения.
...
Рейтинг: 0 / 0
09.11.2013, 01:30
    #38458571
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Dima T ... Например был случай когда запускались две проги для генерации экселевских файлов (разных), эксель периодически зависал и одну из прог завешивал. Начал запускать под разными ползователями - проблема исчезла.
Запускание Excel в таком виде не рекомендуется так как он использует профайлы клиента для своих временных файлов ресурсов. Microsoft рекомендует использовать другую архитектуру для того, что Вы описали... но только не использование самого Excel :)
...
Рейтинг: 0 / 0
09.11.2013, 09:57
    #38458637
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Sergey ChVFP itself - это старый добрый COM+ object и скорее всего не многопоточный. Отсюда открытые в одной сессии объекты могут мешать друг другу борясь за одинаковые ресурсы.
Не согласен.
За какие конкретно ресурсы могут бороться два фоксовых приложения в одной пользовательской сессии?

Поверю, если увижу конкретный тест это подтверждающий.
...
Рейтинг: 0 / 0
09.11.2013, 13:59
    #38458734
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
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.
PROCEDURE DoTimer(m.TimerName_yc)
LOCAL m.tmr_lo
CLEAR
? 'Ctrl+F12 to CLEAR EVENTS'
? TIME()
m.tmr_lo = NEWOBJECT ('FatTimer') &&, '', NULL, m.TimerName_yc)
m.tmr_lo.ObjName = m.TimerName_yc
m.tmr_lo.Enabled = .T.
ON KEY LABEL CTRL+F12 CLEAR EVENTS
READ EVENTS
? TIME()
ON KEY LABEL CTRL+F12
ENDPROC && DoTimer

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

PROCEDURE Timer
IF NOT THIS.Enabled
  RETURN
ENDIF
? TIME(), STR(THIS.Counter,2), THIS.Enabled, THIS.ObjName
THIS.Counter = THIS.Counter + 1
IF THIS.Counter < 99
  SleepSDK(3000)
ELSE
  THIS.Enabled = .F.
  ? TIME(), 'Stopped', THIS.ObjName
ENDIF
ENDPROC && Timer

ENDDEFINE && FatTimer

PROCEDURE SleepSDK (m.MilliSec_yn)
DECLARE Sleep IN WIN32API LONG nMillisecs
Sleep (m.MilliSec_yn)
CLEAR DLLS Sleep
ENDFUNC && SleepSDK

...
Рейтинг: 0 / 0
09.11.2013, 14:10
    #38458739
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Rostislav D. Kudryashov, увы, при оформлении приложений как exe-файлы интерактивная реакция их окон не ускоряется.
...
Рейтинг: 0 / 0
09.11.2013, 14:32
    #38458747
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEv, а вот замена "SleepSDK(3000)" в процедуре Timer() на
Код: plaintext
1.
2.
3.
4.
  m.StopTime_ln = SECONDS () + 3
  DO WHILE SECONDS() < m.StopTime_ln
    DOEVENTS
  ENDDO
изрядно ускоряет интерактивную реакцию окон приложения.
...
Рейтинг: 0 / 0
09.11.2013, 15:09
    #38458765
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEv, Окна приложений стали идеально интерактивно реагировать после следующего переоформления класса FatTimer.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DEFINE CLASS FatTimer AS Timer
Interval = 100
LastWorked = 0
Counter = 0
ObjName = ''

PROCEDURE Timer
DOEVENTS
IF THIS.LastWorked > 0 AND SECONDS() < THIS.LastWorked + THIS.Interval/1000*0.9
  RETURN
ENDIF
THIS.LastWorked = SECONDS()
...
... остальное без изменений
Десятикратное увеличение частоты запуска таймера никак не тормозит реакцию
...
Рейтинг: 0 / 0
10.11.2013, 12:39
    #38459227
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
MaestroEv, вот ведь оказия! Если при самоостановке, когда в Timer() выполняется THIS.Interval=0 или THIS.Enabled=.F., выполняется также и DOEVENTS, то все застрявшие из-за выполнения таймера большего, чем Interval, вызовы сразу гасятся. Их отсечка через LastWorked становится ненужной.
...
Рейтинг: 0 / 0
10.11.2013, 15:25
    #38459325
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Rostislav D. KudryashovMaestroEv, а вот замена "SleepSDK(3000)" в процедуре Timer() на
Код: plaintext
1.
2.
3.
4.
  m.StopTime_ln = SECONDS () + 3
  DO WHILE SECONDS() < m.StopTime_ln
    DOEVENTS
  ENDDO
изрядно ускоряет интерактивную реакцию окон приложения.
READ EVENTS чем не устроил? Зачем этот велосипед с квадратными колесами?
...
Рейтинг: 0 / 0
10.11.2013, 15:40
    #38459336
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько экземпляров фокса на сервере
Dima T, вообще-то READ EVENTS меня устроил, но расположил я его не в том месте, которое ты мне процитировал, а в запускающей PROCEDURE DoTimer(). Из текста примера ты должен был заметить, что по нажатию Ctrl+F12 выполняется CLEAR EVENTS.
А процитированный тобой фрагмент содержит не "квадратные колёса", а DOEVENTS, необходимый для гашения вызовов Timer(), застрявших в Windows из-за времени обработки события SECONDS() + 3, большего чем FatTimer.Intreval = 1000 (и тем более = 100).
Кроме того, я предполагаю, что DOEVENTS ускоряют интерактивную реакцию окна приложения. Хотя, в этом плане, мне не всё так очевидно.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Несколько экземпляров фокса на сервере / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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