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

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

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

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

suv2: Есть еще 4-е решение. Вместо inkey() использовать MyInkey(), в которой (И ТОЛЬКО В НЕЙ) вручную делать разгрузочные вызовы (т.е. вызывать функцию, которая делает один разгрузочный вызов. Или включать разгрузку, а по выходу из MyInkey - выключать разгрузку, если соответствующая библиотека позволяет это делать). Для проверки выходов из цикла - использовать inkey(), при этом разгрузочных вызовов делаться не должно. При этом все стандартные интерфейсные функции (если они используются) должны быть ПЕРЕПИСАНЫ заново (переделка inkey на MyInkey). Это get-система, wait, menu to, browse, dbedit. Часть функций - есть в исходниках на PRG в комплекте поставки, а такие вещи как achoice - надо переписывать самому. Т.е. простых путей нет и для того, чтобы клиппер-программа работала быстро и при этом не тормозила систему в целом, когда не программа не работает - надо потрудиться. Кто ленится - у того тормозит либо система, либо ему надо жать CTRL, чтобы программа работала быстро))) либо часы системные серьезно отстают )

Dima: suv2 СПАСИБО ЮРА !!!!

Sergy: у меня были похожие мысли: вот... пока придумал пару ходов: 1) в очередной раз перелопатить все исходники и вызывать FT_IamIdle() только на время ожидания ввода с клавиатуры...MENU TO, INKEY(x), ACHOICE(), DBEDIT() и тп что тянет за собой кучу проблем: когда DBEDIT или ACHOICE вызывает call-back функцию и эта функция начинает интенсивную работу... значит на входе в эту функцию снова нужно вызывать OnIdle() без параметров... а таких функций - десятки... замкнутый круг (?) буду думать в этом направлении. Спасибо!


suv2: suv2 пишет: Есть еще 4-е решение. Вместо inkey() использовать MyInkey(), в которой (И ТОЛЬКО В НЕЙ) вручную делать разгрузочные вызовы при этом надо помнить, что если в цикле тогда для проверки на выход надо использовать простую inkey(), чтобы работа цикла не тормозилась

alexmar: suv2 пишет: В моей tslice выгрузка сто лет уж как есть, просто сюда не заливалась - нах никому не нужна. а каким образом она выключается? suv2 пишет: Моя версия разгрузки встроена непосредственно в переделанное мной ядро клиппер, и она вызывается только в те моменты, когда действительно программист В СВОЕМ КОДЕ (PRG) вызывает функцию считывания клавиатуры INKEY. Так получается, что TSInstall() можно использовать с переделанным ядром клиппера?

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

suv2: alexmar пишет: а каким образом она выключается? tssupport (.T.|.F.) - вроде так alexmar пишет: Так получается, что TSInstall() можно использовать с переделанным ядром клиппера? Раньше было - с любым. Библа была навесная и работала по типу вируса. Она искала в памяти определенный код, стирала часть кода, писала код передачи управления на себя, потом делала свои черные дела, выполняла сама затертую ранее часть кода и отдавала дальше управдение клипперу. Потом я посмотрел, как делает разгрузку Стекленев - оказалось, что есть некий апи и можно вызывать свою функцию разгрузки более дешевым способом. Но когда я попробовал так и сяк, мне не понравился ни мой способ, ни способ Стекленева. Если не изменяет память - что мой код, что его - вызывается постоянно. Например даже тогда, когда пользователь непрерывно стучит по клавиатуре. В этом случае вызывать разгрузку абсурдно - я например могу вводить строку, а программа выбирает из базы подходящие строки, зачем замедлять этот процесс? Кроме этого, если мне не изменяет память, была и более серьезная причина. Клиппер опрашивает клавиатуру в фотовом режиме и функция разгрузки (в моей библиотеке и в его) вызывается все равно даже тогда, когда я не вызываю inkey, а работаю с базами. И пришлось пойти в ядро, расковырять его и сделать вызов разгрузки только тогда, когда клиппер пытается ДЕЙСТВИТЕЛЬНО (с помощью ЯВНОГО ВЫЗОВА INKEY) считать клавиатуру + а пользователь ничего в данный момент не жмет (т.е. инкей ожидает ввода) Эту задачу на момент ее рещения мне было проще сделать не навесным способом, а встроить непосрелдственно в ядро, поскольку я на тот момент обладал большинством декомпилированных исходников ядра клиппер-машины. И чем писать внедряющийся код, я просто вставил разгрузку в ядро. Поэтому эта библиотека доступна только вместе с ядром) Могу залить в принципе. Из того, что мне там нравится - макрооператор проглатывает строки до 2048 символов ) ну и так всякие исправления, фиксы багов всякие, с отладчиком всякие приколы)

alexmar: suv2 пишет: Поэтому эта библиотека доступна только вместе с ядром) Могу залить в принципе Пока, пожулуй, не нужно. Сейчас пробую встраивать разгрузку, как Sergy, через FT_OnIdle({||FT_IamIdle())}) в модернизированную MyInKey() с учетом того, о чем говорилось здесь выше. Если все будет нормально, то остановлюсь на этом варианте. ЗЫ Обнаружил, правда, что FT_IamIdle() конфликтует с отладчиком. Вываливается по GPF после того, как в отладчике 10- 15 раз нажмешь клавиши управления. Приходится отключать разгрузку при работе од отладчиком. Sergy, ты работал с FT_IamIdle(). У тебя такого не было?

Sergy: с отладчиком не работал ВАЩЕ, поэтому тут ничем не смогу помочь... -------------------------------------- сейчас остановился на FT_IamIdle() - пока полет нормальный.

suv2: alexmar пишет: ЗЫ Обнаружил, правда, что FT_IamIdle() конфликтует с отладчиком Отладчик конфликтует сам с собой. Для того, чтобы нахрен слететь, ему не нужно никаких фт_онидле. )) Вполне себе самодостаточная вещь ))) Но вообще не удивлен)) Есть только ОДНА правильная разгрузка - разгрузка в моём ядре. Все остальное - кривота. Пользуйтесь правильным софтом) Кстати, кто пользуется АДС - тому и этой разгрузки недостаточно, он должен пользоваться особыми навесными функциями разгрузки для АДС ) Требуйте пропатченую мной версию в аптеках города

suv2: Sergy пишет: с отладчиком не работал ВАЩЕ Напрасно, батенька. Уж на что я сам пишу без ошибок ))) Но и то пользуюсь, чтобы в этом убедиться Sergy пишет: сейчас остановился на FT_IamIdle() - пока полет нормальный Там трудностей много, как я писал. Неужто уже все победил?

Sergy: цитата: сейчас остановился на FT_IamIdle() - пока полет нормальный Там трудностей много, как я писал. Неужто уже все победил? да я ведь и ответил... замирания происходят иногда... помогает "нажатие Ctrl" Пока решил поступить таким образом: Написал функцию SetSysPower(nPercentage), которую вызываю перед началом критичного цикла так: x := SetSysPower(100) // мне нужно 100 процентов мощности, + возвращаем установленное значение для сохранения // здесь в цикле делаю что-то... SetSysPower(x) // восстанавливаю первоначальное значение. ----------------------------- в функции SetSysPower() - если требуемое значение мощности более 50 (процентов) - выключаю все FT_IamIdle() - программа работает реально быстро, безо всяких Ctrl Если требуемое значение ниже 50 - восстанавливаю разгрузку системы. ---------------------------- При запуске программы делаю SetSysPower(10) - по умолчанию разгрузка включается. Исходников много, поэтому добавляю по мере реальной необходимости. Потом, если ВДРУГ решу перейти на твой вариант, когда разгрузка по умолчанию ВЫКЛЮЧЕНА, добавленные фрагменты кода просто не будут мешать: т.е. возвращаемое значение для x и так будет равно 100. ---------------------------- Слушай, вот ты всё время говоришь про какое-то переделанное ядро Клиппер: у меня 5.2e + DBFNTX - мне оно можеот пригодиться? Если да - будь человеком, скинь куда-нибудь - давай посмотрим, чего из этого можно реально в жизни применить... Просто так получается, что клипперистов в России осталось человек 20 (судя по нашему форуму) - какой смысл делать из этого суперсекретный проект?

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

alexmar: suv2 пишет: Там трудностей много, как я писал. Неужто уже все победил? У меня переделка заняла где-то пол-дня. По умолчанию разгрузка выключена. Включаю только при вызове Inkey с параметром 0 или больше 0. Вместо штатных MENU TO, DBEDIT() и ACHOICE() использую свои, которые переделал с поддержкой разгрузки. Вроде все работает и тормозов особых нигде не наблюдаю.

alexmar: Sergy пишет: ... так получается, что клипперистов в России осталось человек 20 (судя по нашему форуму) off Увы, печальный факт. И как хорошо, что этот форум еще жив. Наверно это последний заповедник клипперистов бывшего союза...

ort: alexmar пишет: Наверно это последний заповедник клипперистов бывшего союза... Может, сделаем перепись оставшегося населения?

suv2: alexmar пишет: У меня переделка заняла где-то пол-дня. По умолчанию разгрузка выключена. Включаю только при вызове Inkey с параметром 0 или больше 0. Вместо штатных MENU TO, DBEDIT() и ACHOICE() использую свои, которые переделал с поддержкой разгрузки. Вроде все работает и тормозов особых нигде не наблюдаю а вот и неправильно) включай разгрузку только в том случае, если инкей за целую секунду не получил никакой кнопки и продолжает ждать))) В этом случае ты можешь более дешево проверять ESC при работе цикла))) Один раз считали, ESC не обнаружен, продолжили шуровать базы, разгрузку не вызывали, скорость работы не теряем))) думать надо, думать)))



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