Форум » [x]Harbour » Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка" » Ответить

Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"

Sergy: Добрый день, уважаемые коллеги. Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении. Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!" Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило. Возникли ошибки на этапе линковки: [more]Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_HB_FUN_ENVPARAM' referenced from D:\HB\TRADE100.OBJ Error: Unresolved external '_HB_FUN_INKEYTRAP' referenced from D:\HB\TRADE226.OBJ Error: Unresolved external '_HB_FUN_DISKFREE' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_DISKTOTAL' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_BIOSDATE' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONTICK' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_FT_IAMIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_TRAPANYKEY' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_KEYSEND' referenced from D:\HB\TRADE200.OBJ 1) Так понимаю, это ошибки из-за того, что не находятся некоторые функции из активно используемых CT3/Nanforum Toolkit ? Что делать с ними ? Отказываться ? Или есть заменители ? Error: Unresolved external '_HB_FUN_STACKFREE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCTOT' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCTOT' referenced from D:\HB\TRADE200.OBJ 2) Это - ошибки из-за вызовов встроенных в Blinker функций, без них легко обойтись в принципе... Error: Unresolved external '_HB_FUN_STRNUM2ARRAY' referenced from D:\HB\TRADE208.OBJ Error: Unresolved external '_HB_FUN_CMJS_EXTRACTPARAMS' referenced from D:\HB\TRADE206.OBJ Error: Unresolved external '_HB_FUN_SELECTSTOCKS' referenced from D:\HB\TRADE220.OBJ Error: Unresolved external '_HB_FUN_APPLYSERTCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYCARGOCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYPRICECHAGES' referenced from D:\HB\TRADE221.OBJ 3) А вот это - самое странное - это мои функции, причем некоторые из них вызываются многократно из других модулей. Например ApplyCargoChanges является STATIC в самом модуле TRADE221 - почему линковщик ее не видит, наряду с парой Apply... других ? SelectStocks активно используется в других модулях - но там линкер почему-то ошибок не видит... [/more] Help, please - что делать и куды бечь ?

Ответов - 285, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Andrey: Sergy пишет: Для построения отчета использую таблицу продаж Какая таблица ? Какие критерии построения отчета ? Дайте примеры что ищите...

Pasha: Sergy пишет: Как условная индексация может тут помочь ? Никак. Каждый инструмент хорош для своих целей. Условная индексация применяется, если надо полностью исключить из индекса данные по некоторому условию.

Sergy: Вопрос. Существует ли какой-нибудь способ "снести" работающую программу на Harbor с клавиатуры с установленным SETCANCEL(.F.) ? Суть в следующем: есть довольно сложный участок кода, приводить его здесь в качестве "самодостаточного примера" нет никакой возможности: куча RELATION, FILTER по нескольким открытым таблицам: типичная работа юзера: открыть накладную, нажать Insert, выбрать (отфильтровать) нужный товар, нажать ENTER, ввести нужно кол-во -> товар добавляется в накладную. Опять начались необъяснимые вылеты программы: ни стандартный обработчик ошибок, ни hb_out.log ничего не дают: в обоих случаях пусто. Программа просто схлопывает окно без малейшего сообщения. По диспетчеру задач утечек памяти (как было с ошибками 9ххх) точно нет. Зависаний, подтормаживаний - тоже. Все летает, потом - бац - окна нет. Сделал тест: в основном цикле обработки нажатий юзера сделал примерно следующее: при нажатии K_ALT_F1 в буфер клавиатуры засылаются типичные нажатия на клавиши юзера (K_INS + случайная последовательность цифр (типа, поиск товара) + K_ESC (отмена) или K_ENTER (выбор) + заново K_ALT_F1 (чтобы зациклить процесс). В ходе чего тупо увеличивается счетчик и при помощи STRFILE() сбрасывается в локальный файл, чтобы понять, сколько раз цикл проработал. В результате: цикл отрабатывает уже несколько тысяч раз - гораздо больше, чем за день набивает среднестатистический юзер - все ровно. И в локальной базе на компе с Harbour и в реальной сети. Может там какой CTRL в комбинации с ALT позволяет сделать что-то типа ALT_C при SETCANCEL(.T.) ?


petr707: Добавить режим работы программы (по настройке) - запись в лог всех действий юзеров , с указанием места в коде программы, до отдельных клавиш клавиатуры можно не детализировать. Можно поймать момент времени, когда и в каком месте кода произошло прекращение работы. Применяется ли EXIT procedure и что фиксируете при нормальном завершении? Можно организовать отдельный поток ( с логированием) который просто через интервал ( 10 сек) в этот же лог работы юзеров будет скидывать состояние некоторых ключевых параметров состояния

Sergy: petr707 пишет: Применяется ли EXIT procedure и что фиксируете при нормальном завершении? При запуске программы из mem-файла берется error_counter (изначально равный -1, увеличивается на единицу и сохраняется назад в mem-файл. При нормальном завершении уменьшается на единицу и еще раз сохраняется в mem-файл. Во время работы значение err_count мониторится. Если не равно нулю - значит был вылет. Можно организовать отдельный поток ( с логированием) который просто через интервал ( 10 сек) в этот же лог работы юзеров будет скидывать состояние некоторых ключевых параметров состояния Спасибо за идею. Организовывать MT для задачи, которая и так себя нестабильно ведет, наверное не совсем верно. Попытаюсь решить через SaveConsole()/RestConsole() - мою обертку для SAVESCREEN()/RESTSCREEN() - они вызывается чаще всего и регулярно при входе/выходе в большинство процедур.

AlexMyr: Sergy пишет: ни стандартный обработчик ошибок, ни hb_out.log ничего не дают: в обоих случаях пусто. Т.е. hb_out.log появляется, но он пустой? А про обработчик ошибок что имеется ввиду что тоже пустой? Можно пересобрать harbour c опцией: ## Memory statistics/tracking Build Harbour with: HB_USER_CFLAGS=-DHB_FM_STATISTICS потом пересобрать прогу и смотреть появится ли fm.log (вроде так) при очередном падении, если да, то смотреть что там.

petr707: Есть еще идеи 1) Если всю программу обернуть в begin..recover.. end то можно обнаружить некорректно перееопределенный ERRORSYS begin sequence ... all_program() recover using oError // В этой секции ? " Undefined error" end sequence 2) MT тем и хорош, что можно в поток обернуть проблемный вызов, и если он грохнется, основной поток будет жить и сможет разобраться,почему поток свалился. 3) Аналогично пункту 1 - почти весь код оборачивается во второй поток, в главном -только хорошо отлаженная диагностика свала второго потока

Sergy: AlexMyr пишет: Т.е. hb_out.log появляется, но он пустой? Сейчас вижу, что я некорректно выразился. Имелось в виду, что hb_out.log не появляется. А про обработчик ошибок что имеется ввиду что тоже пустой? Еще с давних времен я сделал свой обработчик ошибок, который при запуске программы устанавливается и больше не меняется. В случае возникновения программных ошибок, он выводит сообщение на экран и дублирует в файл, вместе со стеком вызовов, номерами строк, состоянием памяти, открытыми таблицами и тп. При следующем успешном запуске программы этот файл сливается в каталог с dbf таблицами - и не вставая с кресла можно понять, что именно, где, у кого и когда именно произошло. Для отлова программынх ошибок - самое то. Так вот в данном случае обработчик тоже "ни гу-гу".

Sergy: petr707 пишет: Есть еще идеи Хм... надо подумать в этом направлении.

Sergy: Поднял лог редактирований исходников и сравнил с ростом "неожиданных вылетов", которые начались в начале этой недели. Из значительных изменений, сделанных в программе было: #define RUN(x) HB_ProcessRun("cmd /c "+x) Вчера вечером отменил этот код, сегодня держу пальцы крестиком, но половину рабочего дня вылет был один раз и только на одной машине.

Sergy: Попутно возник еще вопрос. Есть dbf таблица на сервере с одной записью. Каждая машина в свой отдельный файл скидывает в нее свое состояние: стек вызовов, снимок экрана, дату/время и тп - как раз для диагностики происходящих вылетов. Вызов происходит в процессе FT_OnTick() каждые 10 секунд. Я на своем компе открываю мониторинг и вижу, что происходит на других компах. Обратил внимание, что дата модификации этого dbf файла не совпадает со штампом времени, в который сделана запись. Например: я смотрю у юзера состояние, присланное в 18:02, а сам файл имеет 4 штампа: [pre2] Far CTRL-A: ДД.ММ.ГГГГГ чч:мм:сс,мс Время последней записи: 20.09.2013 16:31:46,158 Время создания: 20.09.2013 15:25:15,916 Время последнего доступа: 20.09.2013 17:34:39,906 Время изменения: 20.09.2013 16:31:46,158 [/pre2] Почему уже полтора часа (с 16-30) не обновляется "время изменения" ? Может, до тех пор, пока пишущая программа не закроет эту таблицу не произойдет изменение ? Но почему тогда не меняется "время последнего доступа", если я смотрел только что с другого компа ? Раньше не обращал внимания на такие вопросы и мне кажется, в Clipper все было предельно четко: прошла запись - атрибуты файла соотв. образом изменились. Был лаг из-за небольшого отставания/спешки часов в ntvdm машине - но это было понятно хоть почему.

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

Pasha: Sergy пишет: Почему уже полтора часа (с 16-30) не обновляется "время изменения" ? Современные ОС еще не так чудят. 5 минут назад: Win7. Делаю xml-файл с помощью классов А.Кресина. Размер - 1.5М. Штатно закрываю его на локальном диске посредством oXml:Save( cFile ) Закрываю программу, перехожу в фар. Фар показывает его размер - 0 байт. Открываю его редактором, вьювером. Файл создан нормально, но его размер - 0. Только после копирования файла на другой диск исходный файл получил размер. Не верю своим глазам (изыди, нечистый). Плюю через левое плечо. Удаляю файл и проделываю все по новой. Размер появляется сразу. Изгнание беса помогло.

Sergy: Еще вопрос. Под Clipper работали сочетания клавиш ALT+цифры. Иногда, в некоторых местах программы довольно удобно было поставить "специальную" метку в реквизитах клиента, описании и тп. Например, "сеточка" ALT+1+7+6, "квадратик" ALT+2+5+4 и тп. Как активировать подобный функционал в Harbour ?

PSP: Sergy пишет: Как активировать подобный функционал в Harbour ? Сейчас проверил, работает. Терминал GTWVT. Пример простейший: [pre2]FUNCTION Main() LOCAL c := " " CLS @ 0, 0 GET c READ QUIT[/pre2] В get-е появляются символы с набранными на цифровой клавиатуре кодами.

Dima: Sergy пишет: Как активировать подобный функционал в Harbour ? Ни чего не нужно активировать , все и так работает ALT + твой код на цифровой клавиатуре

Sergy: Эк меня приглючило. И действительно, работает... Оказывается, для Harbour главное, чтобы NumLock был включен. В Clipper (ntvdm) работало в любом состоянии NumLock. Только что проверил. Спасибо!

PSP: Sergy пишет: Оказывается, для Harbour главное, чтобы NumLock был включен. В Clipper (ntvdm) работало в любом состоянии NumLock. Только что проверил. Спасибо! Во как! Спасибо тоже! :)

Sergy: Подскажите плиз, уже намаялся: Вот, допустим, накосячил я где-то в исходнике (ENDIF забыл, ну или там DO / WHILE перепутал...) - возникает несколько десятков ошибок в цепочке. Компилятор выплевывает их всех, разумеется, на экране консоли виден только их "хвост". Как понять, с чего все началось ? Использую hbmk2 под Far. Пока временно приходится ставить высоту буфера экрана под 300 символов, компилировать и потом снова возвращать нормальные 25. Надоело...

petr707: hbmk2 test.hbp -otest.exe> build_test.log и смотреть log а лучше - выбрать среду разработки или редактор с вызовом компилятора



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