bash.im ithappens.me zadolba.li
4475

Ускорено серым веществом

Во времена моего программерского расцвета, в первой половине девяностых, из всех вменяемых междумордных библиотек (для DOS/Windows) существовало всего две: трубо-вижн-борландюшатник и Цинк. Были и ещё какие-то: либо со строго закрытым коммерческим API, доступным только за очень отдельные деньги, либо откровенно лажающие на самых примитивных контролах. В общем, всего две. И ни одна из них не прикручивалась к Clipper 5.x напрямую — всё равно надо было кодить пакет-посредник, что вдвое снижало время отклика.

В общем, мы с коллегой решили: нужен набор интерфейсных примитивов, написанный на самóм Клиппере (и примкнувшем к нему ассемблере). Благо 5.2+ уже в полной мере был вменяемым объектным языком, и всего лишь нужно было заэксплуатировать недокументированное. Сели, обдумали концепт, за пару недель создали ТЗ, ещё через пару месяцев на свет появилась библиотека (статическая, само собой: дело-то под «доской» происходило), которая из текстового описания динамически порождала экранные формы с полнофункциональными контролами. Это вам не из бинарных .FRM вынимать поток — это реальный конструктор форм. Вплоть до того, что сами описания форм можно было хранить в таблице БД и при необходимости править при помощи банального memoedit'а... Да-да, и мета-язык тоже был! Это оно сейчас, когда визуальноe программирование стало нормой, кажется смешным. У нас на тот момент выбор был небогатый.

В середине девяностых на моём домашнем компе умер винч. Умер зонами, в одну из которых попали исходники этой самой библиотеки. Причём и сама бибилиотека, и .OBJ для неё выжили. Пока ещё был некий коммерческий спрос на DOS-программы, эта либа честно поучаствовала в нескольких вполне продаваемых проектах. При этом переписать её не было никакой физической возможности: исходники вымерли вместе с винчестером, а Клиппер-декомпилятор смог возродить менее трети текстов. Остальное не воспроизводилось, так как опиралось на вскрытые, но таки недокументированные особенности языка.

Так к чему я это всё? Ах, да... Среди модальных диалогов был и прогресс-бар. Который, само собой, нельзя было перерисовывать при каждой итерации: обрабатываемые таблицы вполне могли содержать миллионы записей, а рантайм Клиппера — это интерпретатор прекомпилированных байт-кодов (Явы тогда ещё и в проекте не существовало). То есть, это сразу стало ясно, нужен вменяемый пересчёт отношения «current/total» в размер окна с прогресс-баром, то есть нормализация на единице квантования бара. Было немножко арифметики вне цикла, после чего внутри цикла отрабатывались только пороговые значения, которые продвигали бар на полоску вперёд. Правда, именно на Клиппере это решалось чуть проще: часть арифметики делал рантайм, подсаженный на коллбек (и это под ДОСом).

Короче говоря, я до сих пор встречаю два вида прогресс-баров: первый, жутко тормозной, и второй, чётко и шустро отщёлкивающий прогресс — сделанный по тем же принципам, что и у меня, с учётом размера кванта. Второе решение более затратно по серому веществу (ровно на знание арифметики), первое — наповерхностно-очевидно и, следовательно, неверно. Привет коллегам-программерам из девяностых!