Форум » [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

Sergy: petr707 пишет: hbmk2 test.hbp -otest.exe> build_test.log и смотреть log Разумеется, пробовал в первую очередь. Вот что в логе: hbmk2: Compiling Harbour sources... Harbour 3.2.0dev (r1308141636) Copyright (c) 1999-2013, http://harbour-project.org/ 100 200 300 400 500 600 700 Compiling 'main.prg'... 100 100 100 200 300 100 200 300 400 500 600 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 57 errors No code generated.

petr707: hbmk2 ... 1> compile.log 2>error.log

Sergy: Возвращаясь к вопросу ускорения загрузки справочников с сервера в локальную папку: Sergy пишет: Речь в ней идет о DIRTYREAD/TURBOREAD/DBOI_READLOCK Подскажите плиз - к каким все-таки результатам приводит включение этого "ускорителя" ? ... petr707 пишет: для каждой задачи можно проверить и выбрать подходящую схему.. set order to 0; copy to () for...; index on ... может оказаться быстрее чем index on ...; copy to () for...; Поставил пару экспериментов в сети с таблицами, которые в данный момент активно используются юзерами. У меня код USE (cTable) READONLY // без индекса COPY TO (cLocalFile) CLOSE работает примерно в 50 раз медленнее, чем COPY FILE (cTable) TO (cLocalFile) и примерно в 70 раз медленнее, чем STRFILE(FILESTR(cTable),cLocalFile) Но третий способ почему-то не копирует файлы больше 30-40 мегабайт, хотя оперативной памяти явно с избытком в данном случае. Кто знает ограничения на длину строки? У кого какой результат в сравниваемых способах? С учетом того, что часто в локальной папке все равно нужно выстраивать индекс, ускорение получается в 5..10 раз. После перехода с Clipper на Harbour и так всё залетало, а тут получается вообще TwinPower Turbo...


SergKis: Sergy смотри http://clipper.borda.ru/?1-4-40-00000872-000-0-0

Sergy: SergKis пишет: Sergy смотри http://clipper.borda.ru/?1-4-40-00000872-000-0-0 Там идет сравнение различных функций копирования файлов, а у меня волосы дыбом встают от разницы между "файловым" COPY FILE TO и "табличным" COPY TO, которым всегда пользовался...

petr707: Посмотрите примеры обработки таблиц в памяти - скорость впечатляет, может и не потребуется копировать файлы Тэги поиска mem: hb_memio

SergKis: Sergy пишет:Там идет сравнение различных функций копирования файлов, а у меня волосы дыбом встают от разницы между "файловым" COPY FILE TO и "табличным" COPY TO, которым всегда пользовался... COPY TO FILE это __Copyfile() по ссылке gfilatov2002 пишет:По-видимому, Hb_fcopy() будет побыстрее, поскольку она использует буфер размером 65536 (против 8192 у функции __Copyfile()) COPY TO имеет смысл, если надо урезать по полям или условиям выборки сразу. В VO в COPY TO если задан только файл выполнялась FileCopy(...)

Sergy: Возник вопрос: нужен встроенный просмотр картинок, но под терминал GTWIN. Такое возможно ? Хочу отказаться от Irfan View, который нужен только для того, чтобы вывести одну картинку на экран (образец товара).

Dima: Sergy пишет: нужен встроенный просмотр картинок, но под терминал GTWIN Встроенный вряд ли и придется лепить отдельную прогу под GTWVT PS Тоже вывожу образцы товара но прога под GTWVT поэтому и проблем нет.

Sergy: Короче, я обессилел и нифига не понимаю... Месяц уже ищу причину ничем не объяснимых вылетов программы. Поступил следующим образом: расставил в "критических" местах команды ... Trace("before some action 1") ... do some action 1 ... Trace("after some action 1") ... do some action 2 ... Trace("after some action 2") ... Функция Trace просто сбрасывает дату+время+строчку в "свой" лог, чтобы не путать машины. Выяснил, что программа без единого сообщения падает на вот таком коде: [pre2] Trace("SelectFromStock(7): names2 relations cancelled") SELE amount IF (am_ord # 2) SET ORDER TO am_ord ENDIF SELECT(area) RestConsole(scr) sfs_filter_keeper := filter_str // private -->> module static KnowValue(KV_SFS_MODE,show_mode) // сохраняем режим Trace("SelectFromStock(8): before RETURN "+res) [/pre2] Или вот на таком: [pre2] Trace("SaleAddRec(5): work with "+value) s_code := value s_num := 0 s_sale_price := amount->sale_price s_buy_price := ROUND(amount->buy_sum / amount->num,0) IF (ABS(s_buy_price) < 0.0005) .OR. (amount->num==0) s_buy_price := amount->buy_price ENDIF Trace("SaleAddRec(5a): RUB buy price calculated, checking $") [/pre2] В среднем примерно в 3х случаях из тысячи на любом из пяти рабочих компьютеров, где эти операции происходят... Самое убийственное для меня в том, что до расстановки этих Trace вылеты были в среднем 10 раз на тысячу. Тысяча "чистых" отработок взяты не с потолка, это примерное количество строчек в накладных, соответствующее кол-ву "вылетов". Подобные вылеты "на ровном месте" происходят и в других местах программы. Расставлять там Trace() уже не понимаю, зачем... :( Короче, полный ппц какой-то - программа валится как карточный домик от малейшего дуновения... Пару раз при мне, лично сам видел - тупой зависон на ровном месте, программа ни на что не реагирует, загрузка одного ядра процессора под 100% - ничего кроме убийства приложения через диспетчер не помогает... :((( Подумал, может дело в компилере mingw, попробовал сделать hbmk2 myproject.hbp -comp=bcc (остался от версии 3.0.0) - Turbo linker не может найти библиотеку HBNF.LIB... не от версии 3.0.0 же ее брать... руки опускаются, черная дыра какая-то...

petr707: s_buy_price := ROUND(amount->buy_sum / amount->num,0) ... / amount->num ?! Можно смоделировать ошибку и проверить, как работает обработчик ошибок Если "..программа без единого сообщения падает " , то обработчика реально - нет. Вызовите где-нить рядом что-нить типа ... err_simulate() .. Function err_simulate() Local a:=0,b:=1 b:= 2/a return .t. Стремные места можно обрамить не trace , а break recover sequence BEGIN SEQUENCE with {|e| Break(e) } // segment RECOVER Trace("Erron in segment ..") END SEQUENCE При тупом зависоне 100% - ищем hb_out.log немерянного размера - там критическии свалы во множестве

Sergy: petr707 пишет: s_buy_price := ROUND(amount->buy_sum / amount->num,0) ... / amount->num ?! amount->num - целое числовое поле, вполне может быть нулем. Там чуть ниже проверка идет: IF (ABS(s_buy_price) < 0.0005) .OR. (amount->num==0) это алгоритм расчета закупочной цены товара: сумма закупки делится на кол-во в остатках. Если кол-во равно нулю (например, оформляется возврат) - берется цена последнего поступления. Остаток равен нулю примерно... в каждой 50й операции... Ведь с давних времен еще в Clipper повелось: [pre2] d:\Harbour sources\src\rtl\errsys.prg // By default, division by zero results in zero IF e:genCode == EG_ZERODIV .AND. ; e:canSubstitute RETURN 0 ENDIF [/pre2] Обработчик точно есть, он устанавливается в самом начале и исправно скидывает в лог полную информацию об ошибках. Но они точные и четкие: код ошибки, стек вызовов, номера строк, состояние памяти, список открытых таблиц и тп. petr707 пишет: При тупом зависоне 100% - ищем hb_out.log немерянного размера - там критическии свалы во множестве Нету. У меня по умолчанию локальные report.log (сообщения об ошибках, туда-же идет трассировка) и hb_out.log сливаются при каждой команде CloseAll() на сервер под "своим" именем, зависящим от "имени" машины в сети.

petr707: // By default, division by zero results in zero IF e:genCode == EG_ZERODIV .AND. ; e:canSubstitute TRACE("zerodiv was !") RETURN 0 ENDIF Если увидите Trace - то работает обработчик, но позволять этого в качестве рабочих вычислений - нельзя. При неудачном раскладе такое вольное обращение с делением на 0 - может зациклить процесс.

petr707: hb_out. log - легко упрется в 2 Гига - и тогда ничего никуда не сольется

Sergy: petr707 пишет: TRACE("zerodiv was !") Хм. поставлю. Уверен, что будут трассировки. Понимаю, что в математике делить на ноль нельзя. Но почему нельзя этого делать в Harbour ?? Это ведь стандартный текст обработчика, я его скопировал и дополнил дополнительной инфой.

Sergy: petr707 пишет: hb_out. log - легко упрется в 2 Гига - и тогда ничего никуда не сольется Эвона как... Поставлю проверку на это дело... Хотя не совсем понятно, чем помешают именно 2 гига... FAT ни на одной машине давно не используется - только NTFS.

petr707: IF (ABS(s_buy_price) < 0.0005) .OR. ABS(amount->num) <0.0005 s_buy_price := amount->buy_price else s_buy_price := ROUND(amount->buy_sum / amount->num,0) ENDIF

Sergy: petr707 пишет: Разве тяжело сделать аккуратнее ?! Вовсе нет. Сделаю. Прямо сейчас. Как попробовать другой компилер с Harbour 3.2.0 ?

petr707: Не уверен, что в поставке 3.2 есть BCC отладить - можно и на 3.0 ========= rem @echo off cls echo echo .. building P ... set HB_PLATFORM=win set HB_ROOT=C:\hb30 set HB_BIN_INSTALL=C:\h30\bin set path=%HB_ROOT%\bin;c:\borland\bcc55\bin;%path% %HB_ROOT%\bin\hbmk2.exe test_bcc.hbp -oTEST_bcc.EXE > build_.log ... ========== set HB_PLATFORM=win set HB_ROOT=C:\hb30 set HB_BIN_INSTALL=C:\hb30\bin set path=%HB_ROOT%\bin;C:\hb30\comp\mingw\bin;%path% %HB_ROOT%\bin\hbmk2.exe test_m3.hbp -oTEST_m3.EXE 1> build_m3.log 2>error_m3.log ..

Sergy: Поставил в обработчик трассировку: // By default, division by zero results in zero IF e:genCode == EG_ZERODIV .AND. ; e:canSubstitute TRACE(STR(++static_counter)+". Division by zero. ") RETURN 0 ENDIF Нажимаю на кнопку "Расчет заказа по результатам торговли" - в логе 12809 сообщений...



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