|
How to run FoxPro EXE-server asynchronously. Eurika!
|
|||
---|---|---|---|
#18+
Rostislav D. KudryashovЧтобы избежать возобновления работы AsyncServer.WorkIt надо или вставлять в него специально для этого случая какое-то ON ERROR, или просто держать этот метод в отдельном классе, как у меня и сделано. Ведь ON ERROR в WorkIt для персечения его работы это, во-первыхи, извращение, а во-вторых - всё равно всё равно WorkIt останавливается не вовремя. Кроме ON ERROR есть еще COMRETURNERROR() и TRY ... ENDTRY, но это вы уж сами. Из Destroy обычно вызывается процедура закрытия программы, как и из обработчика ошибок, OnShutdown и др. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2013, 20:03 |
|
How to run FoxPro EXE-server asynchronously. Eurika!
|
|||
---|---|---|---|
#18+
Rostislav D. Kudryashovодна милли-секунда - это погрешность срабатывания таймера. Сам то понял что написал? таймер это не аналоговый прибор с погрешностями. Кстати одна миллисекунда это очень много времени. Слабенький процессор в 1,5 ГГц выполняет до 1,5 млн. операций за это время. Rostislav D. KudryashovИспользовать такие значения - просто техническая неграмотность. Быстро работающий код это неграмотность. Забавно. Желаю удачи в написании тормозов. Будет глючить - увеличь интервал ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2013, 20:07 |
|
How to run FoxPro EXE-server asynchronously. Eurika!
|
|||
---|---|---|---|
#18+
Dima T, a prpos на твой PS авторPS Удобнее останавливать Timer.Enabled = .F. На моём компе, если запустить Timer с Interval < 38 и при первом срабатывании в методе Timer поставить THIS.Interval = 0, то и установка THIS.Enabled = .F. не спасает от серии последующих срабатываний таймера. Похоже, это результат разности между скоростью реализации таймера средствами WinAPI и скоростью интерпретации операторов FoxPro. Пока FoxPro перешагнёт одну строку, WinAPI крутанёт таймер несколько десятков раз. Так что рекомендованный тобой "замок" по свойствам Timer на входе самое верное. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2013, 22:50 |
|
How to run FoxPro EXE-server asynchronously. Eurika!
|
|||
---|---|---|---|
#18+
Dima T, a prpos на твой PS Dima TPS Удобнее останавливать Timer.Enabled = .F. На моём компе, если запустить Timer с Interval < 38 и при первом срабатывании в методе Timer поставить THIS.Interval = 0, то и установка THIS.Enabled = .F. не спасает от серии последующих срабатываний таймера. Похоже, это результат разности между скоростью реализации таймера средствами WinAPI и скоростью интерпретации операторов FoxPro. Пока FoxPro перешагнёт одну строку, WinAPI крутанёт таймер несколько десятков раз. Так что рекомендованный тобой "замок" по свойствам Timer на входе самое верное. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2013, 22:52 |
|
How to run FoxPro EXE-server asynchronously. Eurika!
|
|||
---|---|---|---|
#18+
sg12, ну вот ты пытаешься хоть к чему-то прицепить свои "опровержения", а ведь речь о том, что ты не раскаялся в своём предложении поднять метод WorkIt из Member-класса Worker в контейнер для этого класса - класс AsyncWorker. Криминал в твоём предложении тот, что если AsyncWorker.Destroy сработает во время работы метода WorkIt, то этот метод всё равно получит управление сразу после выхода из AsyncWorker.Destroy. Но все члены класса AsyncWorker для метода WorkIt станут недоступны. Так что если WorkIt оказался в классе AsyncWorker, то неизбежен сбой при обращении из WorkIt к членам AsyncWorker. Пока не осознаешь свою ошибку, больше сюда не пиши. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2013, 23:14 |
|
How to run FoxPro EXE-server asynchronously. Eurika!
|
|||
---|---|---|---|
#18+
Еще нужно обязательно делать маппинг таблиц на память, перед использованием. Create, так сказать, FileMappingDBF и т.д.. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2013, 23:18 |
|
How to run FoxPro EXE-server asynchronously. Eurika!
|
|||
---|---|---|---|
#18+
Rostislav D. KudryashovDima T, a prpos на твой PS авторPS Удобнее останавливать Timer.Enabled = .F. На моём компе, если запустить Timer с Interval < 38 и при первом срабатывании в методе Timer поставить THIS.Interval = 0, то и установка THIS.Enabled = .F. не спасает от серии последующих срабатываний таймера. Похоже, это результат разности между скоростью реализации таймера средствами WinAPI и скоростью интерпретации операторов FoxPro. Пока FoxPro перешагнёт одну строку, WinAPI крутанёт таймер несколько десятков раз. Так что рекомендованный тобой "замок" по свойствам Timer на входе самое верное. Я и не говорил что Enabled = .F. спасет от повторов. От повторов спасет только проверка что таймер уже остановлен. Пример выше я давал. Enabled = .F. только упрощает код. Например у тебя несколько мест где прописано .Interval = 1000, если ты 1000 захочешь сменить - надо будет выискивать все места. При использовании Enabled интервал будет указан только в одном месте. Что касается твоих догадок, то Interval < 38 частный случай для конкретного кода на конкретном компе. Может быть больше, может меньше. Если бы была рекомендуемая константа - написали бы в хэлпе. В твоем случае таймер только для организации асинхронности и никаких доп.пауз не требуется, значит ему надо Interval = 1 чтобы полезный код начал выполняться как можно быстрее. Причина в следующем: Timer при включении дает команду виндовсу ( SetTimer() ) слать окну фокса сообщение WM_TIMER, которое с заданной периодичностью добавляется в очередь сообщений и обрабатывается по мере возможности, т.е. в момент остановки таких сообщений может быть несколько и они все будут обработаны фоксом. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2013, 07:19 |
|
|
start [/forum/topic.php?fid=41&startmsg=38179105&tid=1583124]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 342ms |
total: | 475ms |
0 / 0 |