Форум » Clipper » И всё-таки часы отстают... » Ответить

И всё-таки часы отстают...

Sergy: имеем: Clipper 5.2e (DBFNTX) PM + Blinker 6.0 + CTP + FT_OnTick + DosIdle на время критичных операций вызываю DosIDle(FALSE) но все равно, через некоторое время отстают часы от системных... хелп плиз...

Ответов - 37, стр: 1 2 All

Dima: Dosidle выкинь ;) Юзай это http://www.the-oasis.net/files/general/multi102.zip Говорю про allkey() На время критичных операций можно юзать что то типа ft_onidle({|| ft_iamidle()}) для NT и тд ft_onidle({|| ft_iamidle(15,.t.)}) // 15 подбирал руками , вроде оптимально получилось.

Sergy: посмотрел, вроде неплохо задумано, не понял одной вещи: этот самый ALLKEY мне просто нужно включить в мою программу в виде исходника, а MENU TO, INKEY(), GET будут сами к ней обращаться, т.е. она перекрывает имя стандартного вызова библиотеки Clipper ?

Dima: Из того исходника я использую только Allkey() Просто включи его в сборку и все свои вызовы (почти) Inkey() замени на Allkey()


Sergy: подключил, заменил #command [<k>:=] INKEY(<x>) => [<k>:=] ALLKEY(<x>) и сделал FT_ONIDLE({||FT_IAMIDLE()}) все вроде заработало, на часы пока не смотрел, но остался важный момент: DBEDIT... и ещё возникают вопросы: 1) FT_IAMIDLE на сколько должен снижать загрузку ? Мне кажется, чегой-то не очень... 2) где посмотреть про его параметры ? Спасибо!

Dima: Dima пишет: для NT и тд ft_onidle({|| ft_iamidle(15,.t.)}) У тебя какая операционка ?

Dima: Sergy пишет: 1) FT_IAMIDLE на сколько должен снижать загрузку ? Мне кажется, чегой-то не очень... 2) где посмотреть про его параметры ? Посмотри NG к nanfor http://www.blinkinc.com/dl/misc/nfkit.zip

Sergy: нашел описание здесь http://www.engwall.com/clipper/nfpat1a.htm и почти во всем разобрался... ALLKEY получается практически не нужен ? в нашей сети много машин - от 200 до 3000 МГЦ, операционки Win98SE и WinXP - буду подбирать параметры FT_IamIdle() от чего отталкиваться ? Спасибо.

Dima: Sergy пишет: в нашей сети много машин - от 200 до 3000 МГЦ, операционки Win98SE и WinXP - буду подбирать параметры FT_IamIdle() я сделал так if ol_ismswin() ft_onidle({|| ft_iamidle()}) else ft_onidle({|| ft_iamidle(15,.t.)}) endif

Sergy: у меня так: FT_OnIdle({||FT_IamIdle(15,IsWin2K())}) -------------------------------------------------- буду подбирать параметр 15 и проверять часы. Спасибо за помощь!

Dima: Кстати я тоже подбирал и остановился именно на 15 Удачи !

Sergy: после недельного тестирования замечено следующее: 1) часы не отстают (даже чуточку спешат... мне кажется...) но видимо это из-за того, что рабочая станция синхронизируется с контроллером домена (?) 2) при любом значении параметра nIntensity (от 0 до 30) наблюдается задержка с обновлением окна задачи до нажатия на любую клавишу, например: сохраняем текущий экран, рисуем окошко, подготваливаем все GET поля, даем команду READ... в 10% случаев окно не появится до нажатия на любую клавишу (я обычно для "ускорения обновления" нажимаю Ctrl) причем в полноэкранном режиме такое налюдается при значениях nIntensity свыше 5. --------------------------------------------------- вот... пока придумал пару ходов: 1) в очередной раз перелопатить все исходники и вызывать FT_IamIdle() только на время ожидания ввода с клавиатуры...MENU TO, INKEY(x), ACHOICE(), DBEDIT() и тп что тянет за собой кучу проблем: когда DBEDIT или ACHOICE вызывает call-back функцию и эта функция начинает интенсивную работу... значит на входе в эту функцию снова нужно вызывать OnIdle() без параметров... а таких функций - десятки... замкнутый круг (?) 2) увеличить скорость обновления экрана консоли. Под Win98 этот параметр устанавливался в system.ini в секции [386enh] : windowupdatetime=10 (по умолчанию=50). В WinXP этот фокус не работает... Заранее спасибо!

alexmar: Dima пишет: Dosidle выкинь ;) А как насчет TSlice?

Dima: alexmar пишет: А как насчет TSlice? знакомое название , где взять ? ЗЫ не SUV случайно делал ?

alexmar: Dima пишет: где взять ? Ну дык, вроде здесь и лежит http://spravki.net.ru/files/utils/Tslice.arj Да, автор SUV

Sergy: Dima пишет: цитата: Dosidle выкинь ;) А как насчет TSlice? так с Tslice всё и началось - часы отставали... + не было средств контроля за включением/выключением модуля... DosIdle позволяет иногда "выключать" себя, если это необходимо параметром DosIdle(FALSE)

suv2: см след. сообщение

suv2: В моей tslice выгрузка сто лет уж как есть, просто сюда не заливалась - нах никому не нужна. Про отставание часов тож писал - там все хитро, но победить можно. А уж про то, что надо делать, чтобы не жать CTRL для ускорения программы - это я уже столько раз писал на форуме, что и повторять нет смысла

Sergy: будь человеком - скинь сразу ссылки - у меня интернет медленный, а поиск по форуму криво работает...

Dima: suv2 пишет: это я уже столько раз писал на форуме, что и повторять нет смысла Напиши еще раз пожалуйста

suv2: Да там писанины на 4 тома "Войны и мира". Конспективно - функция разгрузки замедляет выполнение программы. Разгрузка должна вызываться только в те моменты времени, когда программа ДЕЙСТВИТЕЛЬНО ожидает нажатия клавиши (т.е. ей нечего делать). Когда идет обработка баз - функция разгрузки НЕ ДОЛЖНА вызываться. Всякие левые (читай - сделанные не мной) библиотеки разгрузки устроены таким образом - они вешаются на функцию считывания клавиатуры и попутно делают разгрузку. Однако, клиппер устроен так, что он считывает клавиатуру ПОСТОЯННО, даже в те моменты, когда идет работа. Следовательно, разгрузка вызывается в те моменты, в которые вызываться не должна. В результате программа работает в десятки раз медленнее и для ее ускорения приходится жать Ctrl. Моя версия разгрузки встроена непосредственно в переделанное мной ядро клиппер, и она вызывается только в те моменты, когда действительно программист В СВОЕМ КОДЕ (PRG) вызывает функцию считывания клавиатуры INKEY. Но даже такая грамотная библиотека разгрузки может приводить к нежелательным последствиям. Например, программисты часто проверяют не нажат ли ESC, чтобы выйти из длительно работающего цикла. Следовательно, чем быстрее процессор и следовательно чем чаще вызывается INKEY() в цикле и следовательно чем чаще вызывается разгрузка - тем сильнее тормозит программа, которая пытается делать полезные действия в цикле. Для преодоления этих трудностей надо применять специальные приемы программирования. 1) Например, отключать разгрузку на время работы цикла. 2) Или считывать клавиатуру не чаще, чем 1-2 раза в секунду. 3) Или не считывать клавиатуру вообще Второй способ предполагает использование seconds(), который сильно тормозит систему. Использование вместо seconds() своей функции, считывающей время не через сервис DOS, а из области данных BIOS приводит к очевидному замедлению системных часов, т.к. виндовый эмулятор DOS выполняет обновление часов при определенных обращениях DOS-программы к сервису DOS/BIOS. Такое же замедление системных часов может быть (не всегда) и при способе 3) Следовательно, наилучшим решением будет 2) с чтением времени своей функцией, написанной специальным образом зы. На клиппер в наше время писать СОВСЕМ не просто.



полная версия страницы