Форум » Документация » Harbour для начинающих » Ответить

Harbour для начинающих

alkresin: Просто сообщаю, что я кардинально обновил одноименную страницу у себя на сайте: http://www.kresin.ru/hrbfaq.html, существенно пополнил (и продолжаю понемногу пополнять) раздел "Отличия от Клиппера".

Ответов - 157, стр: 1 2 3 4 5 6 7 8 All

alkresin: Вчера добавил подраздел про хэш-массивы, сегодня - описание _obj... - функций.

Andrey: alkresin пишет: и продолжаю понемногу пополнять Спасибо БОЛЬШОЕ за ваш труд ! Очень интересные вещи узнаешь и у себя упорядочиваются знания (какие были).

alkresin: Я и сам узнаю много нового, когда пишу эту документацию :). Да и удобно складывать то, что узнал, в одном месте. А то часто бывает - разобрался в чем-то, написал соответствующий фрагмент программы, а через какое-то время напрочь забыл, как ту или иную функцию использовать и даже как она называлась, и ищешь нужный кусок кода по всем исходникам. Так что польза взаимная.


SergKis: Отлично !!! [pre2] aHash2 := hb_hCopy( aHash2, aHash, [nStart], [nCount] ) Копирует пары из массива aHash в aHash. ... aHash2 := hb_hMerge( aHash2, aHash, bBlock | nPosition ) добавляет пары из массива aHash в aHash. .. [/pre2] здесь, наверное, надо уточнить где aHashSourse и где aHashDest

AlexMyr: Примеры для других платформ и компиляторов смотрите в INSTALL INSTALL уже переименован в README.txt

alkresin: Спасибо, поправил.

Andrey: alkresin пишет: а через какое-то время напрочь забыл, как ту или иную функцию использовать и даже как она называлась, и ищешь нужный кусок кода по всем исходникам. Аналогично....

Softlog86: иногда даже про наличие этой самой функции забываешь и пишешь "ручками" .....

pureproft: Не буду новую тему поднимать, в статье достаточно доходчиво о возможностях .... .hrb, но вот что мне интересно является ли он мультиплатформенным если внутри себя по кодировкам и путям к файлам учтёт особенности разных систем?

alkresin: pureproft пишет: .hrb, но вот что мне интересно является ли он мультиплатформенным Не проверял, но, думаю, да.

alkresin: Добавил раздел "Классы и объекты", он еще не закончен, но основные моменты упомянуты. Еще добавлены функции для работы с Public/Private переменными - __mv...

PSP: Александр, есть предложение: нельзя ли в таблицах, в левой колонке, где функции написаны, (например, здесь - http://kresin.belgorod.su/rus/hrbfaq.html#Doc8) применить моноширинный шрифт? На мой взгляд, будет лучше читаться.

alkresin: Попробую.

Andrey: Документация - просто супер !

PSP: alkresin пишет: Попробую. По-моему, гораздо лучше. )))

alkresin: Расширено описание реализации ООП - BLOCK,SETGET,EXTERN методы, ERROR HANDLER

alkresin: Добавил раздел "Регулярные выражения".

Vlad04: Александр. Вопрос не по теме - dbch .Вопрос о шрифте, какой-то он трудночитаемый, привыкать надо. Но не могли бы Вы заменить.

Andrey: Александр, а можно чуть подробней по функциям "Управление запуском процессов" ? И туда же поместить (или отдельно тему сделать про RUN() ) - ShellExecute() ? Ксати а для Linux что используется ? А то многим новичкам (как я раньше) не хватает описания и примеров ... Так же наверно нужно дать описание для Проводника и Папки выбора/записи... Если нужно, свои примеры могу выслать.

alkresin: Вопрос не по теме - dbch .Вопрос о шрифте, какой-то он трудночитаемый, привыкать надо. Но не могли бы Вы заменить. Я его не устанавливал специально, там тот, что по умолчанию в gtwvt, я даже не уверен, что его можно заменить - по крайней мере, gtinfo( HB_GT_FONTWEIGHT, ... ) и gtinfo( HB_GT_FONTNAME, ... ) не работают. Можете перекомпилировать его с gtwin ( убрать ключ /dGTWVT и прописать gtwin.lib вместо gtwvt.lib ).

alkresin: Andrey пишет: Александр, а можно чуть подробней по функциям "Управление запуском процессов" Я с ними еще не разбирался, как только - так сразу :). И туда же поместить (или отдельно тему сделать про RUN() ) - ShellExecute() ShellExecute() ? Это не из Harbour, это из GUI библиотек, наверное. Так же наверно нужно дать описание для Проводника и Папки выбора/записи А что это ?

Andrey: alkresin пишет: ShellExecute() ? Это не из Harbour, это из GUI библиотек, наверное. Да оттуда. ShellExecute(), Проводник и Папка выбора - http://files.mail.ru/4Y9OE8

alkresin: В Harbour для начинающих я включаю описания модулей, функций, средств существующих в Harbour, буду, наверное, включать описания некоторых дополнительных библиотек из Harbour/contrib. А то, что вы предлагаете, это несколько другое.

Andrey: alkresin пишет: А то, что вы предлагаете, это несколько другое. Может быть. Но я в свое время, когда переходил с Клипера, очень долго не мог сделать выбор файла и т.д. Только благодаря вам и помощи на форуме Pasha, Григория и других смог разобраться в этом. Да и задачи выглядят более цивильно с Виндовыми окнами...

alkresin: Возможно, создам попозже новую страницу - что-то типа "Harbour для продолжающих" :), там надо будет подробно описать систему расширения (связь с С) и то, как писать оболочки для вызовов разных API, Windows API в том числе, вот тут в качестве примера и ShellExecute() будет уместен.

alkresin: Добавлены описания еще несколько битовых функций, которые не заметил раньше, и набор фунций компрессии данных, основанных на zlib.

AlexMyr: Александр, вместо HB_OSPATHSEPARATOR() надо HB_PS() 2012-11-23 12:50 UTC+0100 Viktor Szakats (harbour syenar.net) ... * deprecated HB_OSPATHSEPARATOR() with HB_LEGACY_LEVEL4 (after next release). Use HB_PS() instead. HB_OSPATHSEPARATOR() will continue to live as an xhb compatibility function after that.

AlexMyr: Пример для hb_hash() надо подправить вместо FUNCTION Main local harr := hb_Hash( "six", 6, "eight", 8, "eleven", 11 ) надо FUNCTION Main local harr := hb_Hash( ["six", 6], ["eight", 8], ["eleven", 11] )

alkresin: вместо HB_OSPATHSEPARATOR() надо HB_PS() Ok. вместо FUNCTION Main local harr := hb_Hash( "six", 6, "eight", 8, "eleven", 11 ) надо FUNCTION Main local harr := hb_Hash( ["six", 6], ["eight", 8], ["eleven", 11] ) У меня первый вариант работает правильно, а ваш вылетает с ошибкой во время исполнения, пробовал и с Harbour 2, и с Harbour 3.2

AlexMyr: alkresin пишет: ваш вылетает с ошибкой во время исполнения, пробовал и с Harbour 2, и с Harbour 3.2 согласен, мой вариант не катит, извините. Как альтернатива, можно еще использовать такую конструкцию LOCAL harr := { "six" => 6, "eight" => 8, "eleven" => 11 }

alkresin: Обновлен раздел "Компиляция и линковка программы". В частности, добавлен подраздел "Как использовать динамические библиотеки ( dll, so )".

alkresin: Добавил материалы о создании и использовании p-code dll.

Andrey: Если можно, то укажите в разделе "2.4 Hbmk2" как добавить ключ для сборки несколькими компиляторами: под BCC и MinGw (MinGw64) Думаю многим будет интересно...

alkresin: Если можно, то укажите в разделе "2.4 Hbmk2" как добавить ключ для сборки несколькими компиляторами Хорошо, добавлю - только сам сначала выясню как. Вообще, много чего интересного находишь, создавая документацию :) Буквально сейчас, обдумывая разницу между p-code dll и hrb, обнаружил интересную вещь. Оказывается, функции, определенные в hrb, можно, как и в случае с p-code dll, вызывать напрямую, без предварительного получения хэндла функции. Подробности уже добавил в раздел "Работа с hrb - файлами"

Andrey: alkresin пишет: Хорошо, добавлю - только сам сначала выясню как. Там в самом низу... http://clipper.borda.ru/?1-4-0-00000738-000-0-0-1340001121

Andrey: alkresin пишет на своем сайте: 14/11/2012 - Dbc - выложена новая версия 3.8 - добавлена поддержка расширенных типов данных ( F,B,Y,Z,I,2,4,8,Q,V,P,W,T,@,+,=,^ ). Что за типы данных в базе ? Я читал еще где-то на LetoDb, но так и забыл спросить... Дайте описание, а то в языках Clipper/Harbour/xHarbour такого нет !

alkresin: В Harbour/xHarbour они есть, вот выдержка из одного из документов на https://docs.google.com/ D Date 3, 4 or 8 Date M Memo 4 or 8 Memo + AutoInc 4 Auto increment = ModTime 8 Last modified date & time of this record ^ RowVers 8 Row version number; modification count of this record @ DayTime 8 Date & Time I Integer 1, 2, 3, 4 or 8 Signed Integer ( Width : )" },; T Time 4 or 8 Only time (if width is 4 ) or Date & Time (if width is 8 ) (?) V Variant 3, 4, 6 or more Variable type Field Y Currency 8 64 bit integer with implied 4 decimal B Double 8 Floating point / 64 bit binary

Andrey: alkresin пишет: В Harbour/xHarbour они есть А есть ли примеры по их использованию ? Кто пользуется новыми типами переменных ?

Pasha: Я пользуюсь. Насчет примеров - неясно, что за примеры нужны. Создал поле - и используй его, обращайся по имени, как обычно.

SergKis: Pasha пишет:Насчет примеров - неясно, что за примеры нужны Поле + Auto increment. При EXCLUSIVE - понятно, SHARED уже не очень, а в LETO совсем не понятно как будет и стоит ли применять ?

Pasha: Последнее значение autoinc хранится в заголовке dbf, насколько я помню, и dbfcdx его увеличивает по dbAppend() Чтобы клиент letodb его увидел, надо после append сделать commit (если установлено FastAppend), и затем перечитать запись по dbGoto(RecNo()) или dbSkip(0) Можно конечно доработать rdd leto, чтобы сервер после добавления возвращал не только номер новой записи, но и значения autoinc-полей. Сейчас этого нет.

SergKis: Pasha пишет:dbfcdx его увеличивает по dbAppend() насколько стабильно Autoincrement делается для dbAppend() нескольких клиентов, если делать FLock(), наверно будет нормально, а если не делать ? Можно конечно доработать rdd leto, чтобы сервер после добавления возвращал не только номер новой записи, но и значения autoinc-полей. Сейчас этого нет. Возможно кому то это актуально, но нам нет. Сервер подстрогали под себя с использованием переменных сервера и триггера.

Pasha: SergKis пишет: насколько стабильно Autoincrement делается для dbAppend() нескольких клиентов, если делать FLock(), наверно будет нормально, а если не делать ? Я autoinc не использую, и насчет стабильности точно не скажу. Но мне кажется, что и без flock, т.е. по rlock, будет стабильнее, чем делать go bottom, выбирать последний ключ, и т.д, поскольку узких мест для autoinc меньше.

alkresin: http://kresin.belgorod.su/rus/hrbfaq.html обновлена - добавлено описание hb_idle... функций.

Andrey: SergKis пишет: Поле + Auto increment. Дайте пример пожалуйста как это делать ? Ни разу не видел и не знаю как сделать...

SergKis: Andrey пишет:Дайте пример пожалуйста как это делать ? Ни разу не видел и не знаю как сделать... Аналогично, но думаю как то так: aStru := {{"R_0", "+", 7, 0}, ...} ? R_0 // nnn dbAppend(.T.) dbUnlock() ? R_0 // nnn+1

alkresin: Добавлен подраздел 3.10 INET подсистема с описанием всех hb_inet... функций.

gustow: alkresin Александр, может быть постепенно начать это описание перегонять в тот же Викиучебник? (там же, где я начал про Harbour - вот тут - да никто [пока] не поддержал) (даже без "изысков", без разбивки на разделы в разных страницах, одним plain-викитекстом) Или переделать нашлепанное мной - или рядом "с нуля" (под каким-то чуть иным названием)... Тогда можно было бы коллективно "по 5 копеек" править/дополнять. Или нет смысла? Если есть - могу "скелет" по уже существующему (Вашему) сделать.

alkresin: Александр, может быть постепенно начать это описание перегонять в тот же Викиучебник? Перегоняйте :). Лично мне удобнее хранить/пополнять эти описания так, как сейчас, поскольку, во-первых, я могу их править в оффлайне простым текстовым редактором ( я пользуюсь Far с плагинами ) и, во-вторых, опять-таки в оффлайне использовать как справочник. Кстати, там есть небольшая ошибка, та же, что и в Википедии ( ту статью тоже вы писали ? ): Первые версии Harbour были созданы Антонио Линаресом (исп. Antonio Linares) (Испания) в 1999 году.Антонио сам не создал ни одной версии, хотя его вклад на начальном этапе был значительным. Он выступил с инициативой, сказал: давайте будем делать так, так и так, выложил первые файлы - заготовки, версией это назвать нельзя, так как с ними еще ничего нельзя было делать.

gustow: alkresin пишет: ту статью тоже вы писали ? "Ту"?.. Я писал (опять же, не "из головы", а переводя из англо-Вики, оф.сайта и еще откуда-то - возможно, в т.ч. и из вас) и в Википедии, и (практически копипастом) перенес в Викиучебник. Насчет там есть небольшая ошибка - я не историк, я только учусь :) Не тщился сходу создать "подлинную историю Harbour" - лишь сделал "заготовку" (уж что где увидел-перевел, возможно, что увидел не то); никто из лучше меня знающих предмет (или желающих "иметь русскую документацию") не поддержал хотя бы "тремя копейками правок" (не жалуюсь и не наезжаю - просто констатирую ;) взгляните в Вики-статье в "История" - кроме меня, существенного изменения не внёс никто). Мне тоже удобнее иметь офлайн-справочник (и спокойно пользуюсь CHMами из поставки HMG - на столько-то знаний английского хватает), но дело в настоящий момент обстоит таким образом, что НЕ СУЩЕСТВУЕТ нормального, внятного онлайнового "курса молодого бойца" на РУССКОМ языке (да и офлайнового - тоже; да и "немолодого бойца" - тоже). Предположим, некий "неофит", захотевший либо перегнать клипперную прогу и добавить туда некие харборовские "навороты", либо слепить нечто на HMG, но не силён в английском - практически обречен начать задавать, например, здесь в форуме, "дурацкие чайниковские вопросы" типа "с чего начать?"; ему НЕ надо еще знать, "как скачать исходники Harbour с SVN" или еще что-то, ему нужен раздел "вот что можно сделать!" (на том же "стандартном Harbour" и "стандартном Harbour+HMG"; как первоначальная "завлекалочка"), раздел "делаем шаг за шагом", раздел "справочник", раздел "ЧаВо"... У англоязычных это более-менее есть, у испаноязычных - есть, у португало (бразило-португало) - есть, у русскоязычных - пока нет. И времени/сил лепить в одиночку ни у кого из нас, конечно, нет. Потому (в том числе), думаю, здесь активно участвующих (в т.ч. и присоединяющихся "неофитов") достаточно немного - поскольку НЕТ "учебника для 1го класса". Ребята! Я же не сержусь и никого не "гоню пинками" википедировать! :) :) Просто "уж сколько раз твердили миру", что "вот бы кто сделал хоть какую-то русскую доку..." А проще Вики для коллективного создания подобного методом "с каждого по копейке"... если кто знает - "ткните пальцем" :)

Andrey: gustow пишет: раздел "делаем шаг за шагом" А то что я написал для хХарбора не пойдет ? http://clipper.borda.ru/?1-6-0-00000002-000-0-0-1355737108 Или для МиниГуи ? http://clipper.borda.ru/?1-6-0-00000003-000-0-0-1355737585 Как на Харбор переводить прогу буду, то напишу инструкцию тоже....

gustow: Andrey , и это, в частности, тоже пойти может, почему нет? Я просто зафиксировал "текущее положение на фронтах" на сегодня. Но не буду больше оффтопить в ветке - Александр, извините ;)

alkresin: gustow пишет: никто из лучше меня знающих предмет (или желающих "иметь русскую документацию") не поддержал хотя бы "тремя копейками правок" (не жалуюсь и не наезжаю - просто констатирую ;) Я даже зарегистрировался на Википедии специально чтобы поправить это дело, оставил там сообщение для авторов, но, может, не там, где надо. Интерфейс там не то, чтобы был интуитивно понятный, пока еще не начал разбираться. Предположим, некий "неофит", захотевший либо перегнать клипперную прогу и добавить туда некие харборовские "навороты", либо слепить нечто на HMG, но не силён в английском - практически обречен начать задавать, например, здесь в форуме, "дурацкие чайниковские вопросы" типа "с чего начать?"; ему НЕ надо еще знать, "как скачать исходники Harbour с SVN" или еще что-то, ему нужен раздел "вот что можно сделать!" Мне кажется, что у меня на сайте достаточно информации для "неофита", или я что-то упустил ? "Что можно сделать" - тоже есть, там несколько программ, написанных на Харборе. А проще Вики для коллективного создания подобного методом "с каждого по копейке" Да, Вики отличный инструмент именно для коллективной работы, но, кроме самого инструмента нужен еще и коллектив - группа людей, желающая этим регулярно заниматься.

alkresin: Добавил в "3.11 Всякие новые функции" описание hb_token... , hb_numtohex, hb_hextonum.

gustow: alkresin пишет: нужен еще и коллектив Вот и я примерно о том же гундел ;) alkresin пишет: Интерфейс там не то, чтобы был интуитивно понятный Ну, в общем-то да - но мне месяца (с перекурами) хватило, чтобы научиться без особых "наворотов" что-то лепить. К Вашей инфе (на Вашем сайте), Александр, претензий не имею (кроме того, что по "технологии" именно Вам, одному, приходится - по необходимости - добавлять/обновлять/оформлять информацию). Но... нескольких "ищущих новых путей" (но слабых в инглише) отправлял туда (правда, где-то с год или раньше назад) - им было либо многое непонятно (с "неофитского" взгляда), либо много лишнего (тоже оттуда же), либо многого недоставало (и тоже оттуда же). Я же не наезжаю - представляю, как "трудновато" грамотно "введение" в достаточно новый язык сделать (особенно для привыкших "программировать", ляпая формочки в каком-то "вижуале", не более того)...

gustow: alkresin Александр, посмотрите "прикидку" вот тут. Содержание (пока) взял из англо-учебника - но "никто не держит нас за руку", чтобы мы не изменили это в два клика :) А начало раздела "Установка" - практически копипастом от Вас. (чтобы слепить это, понадобилось минут 20)

alkresin: Но... нескольких "ищущих новых путей" (но слабых в инглише) отправлял туда (правда, где-то с год или раньше назад) - им было либо многое непонятно (с "неофитского" взгляда), либо много лишнего (тоже оттуда же), либо многого недоставало (и тоже оттуда же). С тех пор там многое изменилось, я два месяца назад это дело кардинально переработал - исправил, убрал весь устаревший материал, часть переписал, добавил еще много "лишнего" :). Наверное, многое можно было бы сделать лучше, но для этого нужна обратная связь. представляю, как "трудновато" грамотно "введение" в достаточно новый язык сделать (особенно для привыкших "программировать", ляпая формочки в каком-то "вижуале", не более того)... Ну, вообще-то, этот материал - не введение в новый язык, он для тех, кто уже писал на Клиппере. Для остальных, действительно, нужен для начала учебник по языку.

gustow: alkresin Александр, смотрели ли "прикидку" в Викиучебнике? (см. на два коммента выше) А то как-то не заметил реакции (ни в каких смыслах) ;)

alkresin: Александр, смотрели ли "прикидку" в Викиучебнике? (см. на два коммента выше) А то как-то не заметил реакции (ни в каких смыслах) ;) То сообщение появилось пока я писал свое и я его просто не заметил. Посмотрел "прикидку". Первое, что хочу сказать - ее бы надо, наверное, сделать частью той страницы По содержанию - я бы сделал раздел "Основы языка" и включил бы туда подразделы "Типы данных и их описание", "Управляющие структуры", "Операторы" ( раз уж мы описываем язык, то и это надо ),"Команды" ( может, не все сразу перечислять, но объяснить, что это такое), "Функции"(то же, что и для команд). Можно здесь делать подразделы ? Термин "парадигмы" я бы здесь не использовал. Парадигма - это не то, что написано в англоязычном оригинале, это нечто другое. Ну и, возможно, именно для начинающих имеет смысл сделать раздел еще до описания языка ( я подумываю и у себя что-то такое сделать ) типа "Начинаем писать на Harbour". И - по шагам: скачиваем вот это и это, пишем вот такую маленькую программу и вот так компилируем, скачиваем GUI библиотеку, пишем вот это и компилируем.

alkresin: gustow пишет: У англоязычных это более-менее есть, у испаноязычных - есть, у португало (бразило-португало) - есть, А ссылки можно ? Что именно имеется ввиду ?

gustow: Вот именно подобную структуру я и имел в виду! С одной стороны - чтобы "неофит" мог быстро и без "уходов в прерывания" создать свое первое приложение (к примеру, с помощью того же "филатовского" HMG EE пакета - типа "всё уж готово для дела, установи BCC, установи HMG и компилируй" - или такого же, не требующего особых плясок с бубном для начала работы, пакета с "просто Harbour"). С другой стороны - справочник (настройки, опции компиляторов, прочие "фокусы", команды, функции, ОС-зависимые вещи, ЧаВо и проч.). Можно же сделать не как я сейчас сделал (у Вас взявши) - просто plain-страницей (хотя в Вики-учебнике как "предпочтительнй" рекомендуют такой подход - но уж больно здоровенная "одна страница" получится...), а именно отдельными разделами ("нужны детали? открывай соотв. раздел с подробным описанием!"). Или вообще сделать несколько отделных (ориентированных на разне цели публикаций: "Harbour для чайников"... и по нарастающей (как по квалификации читателя, так и по узости специализации - к примеру, ясно, что по тому же HMG нужна отдельная книжка... или по HWGUI). В общем, "всё как у больших" ;) alkresin пишет: А ссылки можно ? Что именно имеется ввиду ? Ну, к примеру, тот же Clipper... Clipper... Clipper - достаточно неплохой аггрегатор ссылок на разные публикации и гайды как по миграции с Клиппера на Харбор, так и по разработке приложения "с нуля" (в последнем случае - применимо именно для "чистых" неофитов, не знающих, что вообще был когда-то какой-то Клиппер ;) ). Массимо Бельграно (он ли? помню, что вроде итальянская фамилия... или Пьерпауло Мартинелло?.. вот сходу ссылку не найду) нашарашил здоровенную HTML-страницу по функциям Харбора (но именно как одну страницу - что не всегда есть удобно) (вот бы из нее и "передирать" кусками "по 3 копейки" постепенно коллективом в раздел "Справочник" - установив какой-то "шаблон" для описания функций [внешний вид описания, общепринятая терминология, "стандарты" перевода фраз и терминов]). Еще Harbour Language programming - тоже, конечно, пока еще "заготовка-прикидка", но кое-что интересное есть. У испаноязычных - можно глянуть линки в том же HMGforum.com (тоже, конечно, не "супер", но всё же...). UPD: О! Нашел эту "здоровенную страницу" :) см. I semplici Tutorial della ElektroSoft

alkresin: Если это все, что есть, то мы далеко не в худшем положении. В материалах по этим ссылкам нет того, что мы с вами, по результатам этого небольшого обсуждения, хотели бы иметь. Они обрывочны и совершенно не структуированы. Списки и описания функций представляют собой по другому отформатированные данные из harbour/doc/en и не несут ничего, что и без них можно прочитать в официальной документации. Не сочтите за саморекламу, но, в сравнении с этим, моя страница содержит на порядок более качественный материал, какого вы больше нигде не найдете. Все малопонятные и сложные моменты, никак не прокомментированные в документации, я разбирал по исходникам и сам проверял в действии. Значительная часть функций, конечно, пока осталась за бортом - но именно по той причине, что во всем предварительно надо тщательно разбираться самому. Просто откопипастить из harbour/doc/en не вижу большого смысла.

Andrey: alkresin пишет: Не сочтите за саморекламу, но, в сравнении с этим, моя страница содержит на порядок более качественный материал, какого вы больше нигде не найдете. Да, это точно ! Спасибо БОЛЬШОЕ за вашу работу ! Мы вас очень ценим !

alkresin: Добавил раздел 3.11 Многопоточность. Там еще предстоит добавить общих пояснений и примеров, но уже изложен так интересующий Андрея вопрос о совместном использовании БД в многопоточном приложении.

Andrey: alkresin пишет: Там еще предстоит добавить общих пояснений и примеров, но уже изложен так интересующий Андрея вопрос о совместном использовании БД в многопоточном приложении. СПАСИБО БОЛЬШОЕ ! Но все таки не знаю как сделать небольшой пример по базам .... http://clipper.borda.ru/?1-4-0-00000795-000-0-0-1356519713

alkresin: В раздел 3.11 Многопоточность добавлены новые примеры и пояснения.

alkresin: В раздел 3.10 Inet подсистема добавил пример использования INET функций в многопоточном ( двухпоточном ) приложении. Маленькая консольная программа, которая проверяет главную страницу этого форума на наличие обновлений :)

AlexMyr: alkresin пишет: Маленькая консольная программа, которая проверяет главную страницу этого форума на наличие обновлений :) спасибо за пример, уже тестирую.

AlexMyr: Запустил прогу, написал на форум, говорит "ничего нового", нажал Ecs и получил: Error BASE/3012 Argument error: HB_THREADJOIN Called from HB_THREADJOIN(0) Called from MAIN(32)

AlexMyr: AlexMyr пишет: Error BASE/3012 Argument error: HB_THREADJOIN Забыл опцию -mt, все работает. Извините.

Dima: alkresin Спасибо за примеры. Вопрос. [pre2] DO WHILE .T. hb_mutexLock( mutex1 ) cTime := Iif( !Empty( cOpt ), hb_Dtoc( Date(),cOpt ), Space(10) ) + " " + Time() hb_mutexUnLock( mutex1 ) hb_dispOutAt( 0, MaxCol() - Len( cTime ) + 1, cTime, "GR+/N" ) hb_idleSleep( 1 ) ENDDO [/pre2] Проверка на заблокированность мьютекса не нужна ? Я вот про такой код [pre2] DO WHILE .T. IF hb_mutexLock( mutex1 ) cTime := Iif( !Empty( cOpt ), hb_Dtoc( Date(),cOpt ), Space(10) ) + " " + Time() hb_mutexUnLock( mutex1 ) hb_dispOutAt( 0, MaxCol() - Len( cTime ) + 1, cTime, "GR+/N" ) ENDIF hb_idleSleep( 1 ) ENDDO [/pre2]

Andrey: alkresin Спасибо большое за пример ! Прямо то что нужно ! Побольше таких примеров....

alkresin: В данном случае в этом нет необходимости, так как 1) параллельный поток блокирует mutex на очень короткое время 2) поток, который выполняет этот код, все равно не делает больше ничего полезного, так что, будь даже потенциальная задержка большой, мы бы ничего не выиграли. Может, вы забыли, что hb_mutexLock( mutex1 ) не просто блокирует mutex, но останавливает выполнение текущего потока до тех пор, пока ему не удастся это сделать ( т.е., пока этот mutex не будет разблокирован другим потоком, если он был им заблокирован ).

Dima: alkresin пишет: Может, вы забыли Да точно , упустил этот момент.

Andrey: alkresin пишет: Маленькая консольная программа, которая проверяет главную страницу этого форума на наличие обновлений :) Отрубаем интернет, запускаем прогу, F5, программа пишет - "ничего нового". Правда иногда вверху пишет "сбой"... Через раз... Как бы правильно повесить ALERT("Нет ИНТЕРНЕТА !") ?

alkresin: Нажимать F5, пока не появилось в углу сообщение о наличии обновлений, большого смысла нет. Сообщение "Сбой" выскакивает как раз после каждой неудачной попытки соединения. Если нужна дополнительная информация о причинах сбоя, можно сделать еще одну раздляемую потоками переменную, куда один поток будет записывать текст, возвращаемый hb_inetErrorDesc(), другой - по F5 выводить этот текст.

Andrey: alkresin пишет: Если нужна дополнительная информация о причинах сбоя Да нет, не нужна. Просто проверить, есть ИНЕТ или нет. У Григория есть специальный пример на эту тему: MiniGUI\SAMPLES\Advanced\INET_CHECKER А просто средствами Харбора (функции) есть ? lInet := hb_inetInit() Возвращает .T. при включенном и отключенном интернете. Harbour 3.2.0dev (Rev. 18721)

AlexMyr: В документации указано: А строковые константы можно объявлять, как в C, используя литерал e"...": Local e"Helow\r\nWorld \x21\041\x21\000abcdefgh" при компиляции ошибка Error E0030 Syntax error "syntax error at 'Helow указать какую-то переменную Local str1 := e"Helow\r\nWorld \x21\041\x21\000abcdefgh"

alkresin: А, ну да, конечно, надо исправить.

alkresin: На днях переехал на новый домен и новый хостинг, теперь это http://www.kresin.ru, а "Harbour для начинающих" - http://www.kresin.ru/hrbfaq.html.

alkresin: Добавил новую страницу: Harbour - шаг за шагом - примерно то, о чем мы здесь говорили пару месяцев назад. Что еще можно сюда добавить ?

Dima: alkresin Для первого старта более чем достаточно.

PSP: Александр, видимо придется "Шаг за шагом" подправить в связи с переходом на Git.

AlexMyr: C git тянем исходники, чтобы самим собрать harbour, а в "Шаг за шагом" скачиваем уже готовый дистрибутив harbour готовый к использованию.

PSP: Да, но с течением времени те готовые дистрибутивы будут уже далеко не up-to-date. Решать автору, надо или нет.

AlexMyr: На то они и Nightly binary чтобы быть всегда up-to-date.

PSP: Вы уж простите меня, что спорю, но в только что скачанном мной архиве Changelog.txt оканчивается вот этим: [pre]2013-03-18 19:03 UTC+0100 Viktor Szakats (harbour syenar.net) * doc/en/*.txt * doc cleanups [/pre] Вот я и сделал вывод, что эти архивы не обновляются.

AlexMyr: PSP пишет: Вот я и сделал вывод, что эти архивы не обновляются. Для большинства пользователей лучше скачивать стабильную версию harbour, что и предлагаю указать в "Шаг за шагом".

alkresin: AlexMyr пишет: Для большинства пользователей лучше скачивать стабильную версию harbour, что и предлагаю указать в "Шаг за шагом". Сложный вопрос, я думал об этом и выбрал nightly по следующей причине. Стабильная версия - это 3.0 от июля 2011 года. Сейчас 3.2, с тех пор было множество изменений, в том числе и таких, из-за которых, возможно, при обновлении версии придется что-то менять в программах и опциях того же hbmk. Хотя, может, вы и правы.

PSP: Было слишком много изменений с 3.0 до нынешних пор. 3.0 нельзя рекомендовать, как основу, имхо. Может быть ночные сборки снова будут обновляться ежесуточно...

AlexMyr: PSP пишет: Может быть ночные сборки снова будут обновляться ежесуточно... Будут, настроят скрипты и будут, НО ночные это нестабильные сборки и рекомендовать их новичкам, мы ведь о новичках говорим, нельзя. PSP пишет: Было слишком много изменений с 3.0 до нынешних пор. 3.0 нельзя рекомендовать, как основу, имхо. почему же? это все таки оф. релиз, хоть и 2011 года. Много изменений? Вопрос к Александру - насколько помню, еще до не давнего времени, Вы работали на старых версиях harbour и hwgui, а сейчас?

alkresin: AlexMyr пишет: Вопрос к Александру - насколько помню, еще до не давнего времени, Вы работали на старых версиях harbour и hwgui, а сейчас? На работе для Windows использую Harbour 2 от июня 2010 - чтобы не заморачиваться с последствиями Unicode сборки для Win98 ( у нас кое-где она еще стоит ). Но я не новичок и обновиться до 3.2 для меня не проблема. Полностью согласен со всеми возражениями против ночных сборок для новичков - может, еще пара постов, и вы меня убедите окончательно :).

AlexMyr: Хорошо, изменений много, но о них упоминается только в changelog, т.е. для новичка будет сложно определить что же кардинально изменилось с предыдущего стабильного релиза. Посмотрим в doc/oldnews.txt и увидим для версии 3.0.0 до 30 строк описания изменений с версии 2.0.0 и это за два года, т.е. новичок может подумать что проект вовсе не развивается, хотя на самом деле работы проделано много. Вывод - основы harbour можно изучать и на стабильной версии. И еще по hbmk2 - основное использование это hbmk2 file.prg (но это конечно тривиально), а все опции могут не понадобится никогда даже и для профи.

AlexMyr: И еще один нюанс, Nightly binary только для win, в этом случае будут вопросы у тех кто под linux и не только, а значит качать Current release.

alkresin: AlexMyr пишет: Nightly binary только для win, в этом случае будут вопросы у тех кто под linux и не только Ну, вообще-то, обсуждаеиый Harbour - шаг за шагом сделан пока для Windows пользователей, для Linux еще предстоит это сделать.

alkresin: Обновлен Harbour для начинающих - добавлен раздел 4. Дополнительные библиотеки с подразделами 4.1 Обзор и 4.2 GUI.

alkresin: Изменил-таки Harbour - шаг за шагом, теперь за основу взята стабильная версия 3.0

pureproft: Стоит ли смотреть в сторону 3.0 для "дважды начинающего" или уж сесть и разобраться с текущим состоянием? Что такого очень вкусного можно потерять оставаясь на 3.0? p.s. вопрос от человека не когда не стремящегося к новизне в ущерб стабильности, например в линуксе дистрибутивы на пакетной базе ubuntu 10.04 меня устраивают на все 100% как например XP и прочее для многих http://www.viterminal.ru/blog/page/vi1cwinxp#cut

alkresin: pureproft пишет: Что такого очень вкусного можно потерять оставаясь на 3.0? Принципиальных, знаковых изменений не припомню, хотя, может, что-то упустил. Проблема с Nightly builds простая - никто не гарантирует, что "начинающий", скачав его в "неудачный" день, получит работающий продукт.

alkresin: Harbour для начинающих, 3.2 Некоторые языковые расширения дополнен информацией о расширенных кодоблоках. Рекомендую почитать, там указывается на очень интересную деталь ( реализацию замыканий ), на что, мне кажется, никто еще не обращал внимания.

Pasha: alkresin пишет: Рекомендую почитать, там указывается на очень интересную деталь ( реализацию замыканий ), на что, мне кажется, никто еще не обращал внимания. Так эти замыкания имеются и в клиппере, правда, их так не принято называть. Я еще 20 с лишним лет назад использовал функции вроде: Function C4Block(n) Return {|a| a[4][n]} переменная n остается жить вне функции C4Block, и, таким образом, возвращаемый ею блок кода является замыканием

alkresin: Pasha пишет: Так эти замыкания имеются и в клиппере, правда, их так не принято называть Совершенно верно, я так там и написал. Разница в том, что кодоблок теперь может быть достаточно большим фрагментом кода, полноценной функцией, включающей любые языковые средства и это дает новые возможности по использованию замыканий ( в Javascript это один из основных инструментов ).

alkresin: Скажем так, из-за ограниченности возможностей кодоблоков этой особенности не уделяли особого внимания.

AlexMyr: Насколько я понял про замыкание, то получается, что пример closure можно написать след. образом: [pre2]static nSec Function Main Local b1 := {|p1| Local tmp := nSec IF p1 != Nil nSec := p1 ENDIF Return tmp } nSec := Seconds() ? Eval( b1 ) ? "Press any key" inkey(0) ? Eval( b1,Seconds() ) ? "Press any key" inkey(0) ? Eval( b1 ) ? Return Nil[/pre2] т.е. грубо это использование static переменных, но видимых только в пределах блока кода. Или все намного сложнее?

Pasha: AlexMyr пишет: т.е. грубо это использование static переменных, но видимых только в пределах блока кода. Или все намного сложнее? Не только static, можно использовать и local-переменные. В клиппере/харборе в каждой переменной есть счетчик ее использования. Для local-переменной функции он равен 1. Если переменная используется еще и в блоках кода, этот счетчик инкрементируется. Когда функция завершается, или блок кода уничтожается, счетчик декрементируется. Когда значение счетчика станет равным нулю, переменная будет уничтожена.

Pasha: alkresin пишет: Скажем так, из-за ограниченности возможностей кодоблоков этой особенности не уделяли особого внимания. Я всегда активно использовал замыкания. Из-за ограниченности блоков кода просто делал отдельную функцию, которую вызывал из блока кода, с передачей ей параметров. Этот стиль использую по привычке и в харборе. Не создаю многострочные блоки кода, а делаю отдельную функцию. Разница небольшая.

alkresin: AlexMyr пишет: т.е. грубо это использование static переменных, но видимых только в пределах блока кода. Не совсем. Дело в том, что у каждого экземпляра кодоблока ( если вы запустили функцию Closure() из моего примера несколько раз ) будет свой набор этих переменных ( тех, что определены в Closure() как Local ), т.е. этот экземпляр чем-то похож на объект, вот только по именам нельзя обращаться извне к тем переменным. А в Javascript, кстати, можно - поэтому там эта штука активно используется вместо объектов, в ряде случаев ( есть определенные нюансы ) это бывает удобнее.

alkresin: Добавил JSON - функции, hb_Random...(), и еще по мелочи.

dimao: Александр, спасибо за труд! много интересного узнал о старом добром Харборе. Кстати, весьма полезно, что сразу есть ссылки на скачку и инструкции , как получить работающий комплект Харбор+HWGUI. еще интересно бы узнать, как обстоят дела с компиляцией программ для Андроид? и про создание простейших вебсервисов на Харборе тоже интересно почитать. По английски и испански есть некоторая информация, а по русски - нету.

alkresin: Про Андроид ничего не могу сказать, для меня эта тема не актуальна, у меня нет ни смартфона, ни планшета - и я не планирую их заводить. Вроде, были сообщения в developers list и здесь на эту тему... Вебсервисами занимался, вот тут об этом шла речь. Давно собираюсь сделать страничку на эту тему у себя на сайте.

Dima: alkresin пишет: Возможно, создам попозже новую страницу - что-то типа "Harbour для продолжающих" :), там надо будет подробно описать систему расширения (связь с С) и то, как писать оболочки для вызовов разных API, Windows API в том числе Ждем с нетерпением

Andrey: Dima пишет: Ждем с нетерпением Поддерживаю !

alkresin: Обновил раздел 3.6 Работа с hrb - файлами: Добавлено описание hb_hrbGetFunList(), дополнено описание hb_hrbLoad() - новые параметры.

alkresin: Обновлен раздел 3.12 Всякие новые функции: Добавлены краткие описания семейства hb_FName...()

Alex_Cher: Уважаемый модератор "alkresin" - огромное спасибо за документацию. Это лучшее из всего что удалось отыскать по xHarbour на русском языке. Одна проблема - нет возможности при работе находиться постоянно в интернете. Нет ли возможности скачать данную документацию в PDF формате ...?

Dima: Alex_Cher В браузере Файл - Сохранить как и сохраняем целиком всю страницу куда нужно. Смотрим локально.

santy: Новый сайт для изучения Harbour + HMG A Beginners Guide to Programming with Harbour and HMG

SergKis: alkresin Сломалось на сайте http://www.kresin.ru/ "Статьи" -> "Harbour для начинающих" -> 404 ... Вход с "Главной" по строке 23/08/2016 - Дополнен раздел Harbour для начинающих, 3.3 Классы и объекты - добавлены несколько функций. проходит

alkresin: SergKis пишет: Сломалось на сайте http://www.kresin.ru/ "Статьи" -> "Harbour для начинающих" -> 404 ... Спасибо за информацию. В самом деле пропал файл с сайта. Переписал по новой.

alkresin: Дополнен раздел Дополнительные библиотеки - обновлен список, добавлен подраздел о hbziparc.

Andrey: Классное описание ! Спасибо за описание ! Только сделайте пожалуйста ссылки на эти библиотеки, чтобы всем было понятно, о каких библиотеках идёт речь. Minigui - свободно распространяемая библиотека, в отличие от остальных, основана на использовании массивов, а не классов, но с помощью препроцессора предлагает ООП-подобный синтаксис, отличающийся от ООП-синтаксиса, принятого в Harbour. Я так понял МиниГуи - это несколько библиотек (где слово MiniGui, кстати говоря очень часто встречаемое в библиотеках): 1) Григория Филатова: Harbour MiniGUI Extended Edition - http://www.hmgextended.com/download.html 2) Roberto Lopez: HMG xBase Development System For Windows - http://harbourminigui.googlepages.com

alkresin: Сделал.

gfilatov2002: alkresin пишет: Сделал. Есть еще и библиотека ooHG, полностью совместимая по синтаксису с МиниГуи, но основанная на использовании классов. Это противоречит описанию, которое дано другим диалектам библиотеки МиниГуи Возможно ли дополнить Ваше описание

alkresin: gfilatov2002 пишет: Это противоречит описанию, которое дано другим диалектам библиотеки МиниГуи Ну так помещу ее отдельным пунктом.

gfilatov2002: alkresin пишет: помещу ее отдельным пунктом Благодарю за сверхбыструю реакцию

alkresin: Дополнен раздел Дополнительные библиотеки - добавлены подразделы о hbbz2, hbbz2io, hbgzio.

Dima: alkresin Спасибо за труд ! Простой вопрос. А не могли бы ,вот эту всю документацию конвертнуть в формат CHM , если это конечно не сложно. Если нужна в этом какая то помощь , я готов.

alkresin: Могу, htm2chm справится, наверное. Надо только разобраться, как там разделы сделать.

AndreyZh: alkresin огромное спасибо за Ваш труд!

alkresin: На главную страницу Harbour для начинающих выложил ссылку на chm файл.

nick_mi: После скачивания при попытке открыть выдает информацию Переход на веб-страницу отменен Попробуйте сделать следующее: Повторите ввод адреса.

Dima: nick_mi На файле - свойства-разблокировать и все будет норм alkresin Большое спасибо за CHM !!!

nick_mi: Dima пишет: На файле - свойства-разблокировать и все будет норм Спасибо помогло

alkresin: Упаковал его в zip, чтобы не было этих заморочек с блокировкой.

alkresin: Добавлена информация по File IO API (hb_vf...() ): http://www.kresin.ru/hrbfaq_3.html#Doc12, обновлен chm - файл.

Andrey: alkresin пишет: обновлен chm - файл. Спасибо БОЛЬШОЕ за вашу работу ! А откуда хелпер можно скачать ?

alkresin: Andrey пишет: А откуда хелпер можно скачать ? В смысле chm ? С http://www.kresin.ru/hrbfaq.html, там в самом начале.

Andrey: alkresin пишет: там в самом начале. Спасибо, то что нужно !

alkresin: Добавил подраздел про HiPer-SEEK индексы: http://www.kresin.ru/hrbfaq_3.html#Doc13_14

alkresin: В подраздел строковых функций http://www.kresin.ru/hrbfaq_3.html#Doc13_4 добавил hb_strIsUtf8(), hb_strReplace(), hb_strShrink() - только сегодня их обраружил и был приятно удивлен. Особенно понравилась hb_strReplace()ю

Andrey: Здравствуйте. Очень мало документации по переменным времени. Можете сделать отдельный раздел у себя в справке ? Чтобы было в одном месте.[pre2] tDtm := HB_DATETIME() ? HB_TSTOSTR( tDtm ) // 2021-07-19 00:28:52.946 "C" ? HB_TTOC( tDtm ) // 19.07.2021 00:28:52.946 "C" ? HB_TTOD( tDtm ) // 19.07.2021 "D" ? HB_TTON( tDtm ) // 2459415.02 "N" ? HB_TTOS( tDtm ) // 20210719002852946 "C" cDtm := HB_TSTOSTR( tDtm ) ? HB_STRTOTS( cDtm ) // 2021-07-19 00:28:52.946 "T" ? HB_CToT(cDtm) // 00:28:52.946 "T" cTm1 := cTm2 := "" ? tDtm := HB_DATETIME() // 2021-07-19 00:28:52.949 "T" ? tUtc := hb_TSToUTC( tDtm ) // 2021-07-18 21:28:52.949 "T" HB_TTOD( tDtm, @cTm1, "hh:mm:ss.fff" ) HB_TTOD( tUtc, @cTm2, "hh:mm:ss" ) ? cTm1 // 00:28:52.949 "C" ? cTm2 // 21:28:52 "C" [/pre2]

Haz: Andrey пишет: Очень мало документации по переменным времени. Можете сделать отдельный раздел у себя в справке ? Чтобы было в одном месте тогда тут дублировать весь хелп по харбуру придется. Зачем ? достаточно где есть https://github.com/Petewg/harbour-core/wiki/hb_T Более того в ChangeLog.txt по Harbour эти функции прекрасно документированы [pre2] * harbour/source/rtl/dateshb.c + added new .prg functions to mange date and timestamp values: HB_DATETIME() -> <tTimeStamp> HB_CTOD( <cDate> [, <cDateFormat> ] ) -> <dDate> HB_DTOC( <dDate> [, <cDateFormat> ] ) -> <cDate> HB_NTOT( <nValue> ) -> <tTimeStamp> HB_TTON( <tTimeStamp> ) -> <nValue> HB_TTOC( <tTimeStamp>, [ <cDateFormat> ] [, <cTimeFormat> ] ) -> <cTimeStamp> HB_CTOT( <cTimeStamp>, [ <cDateFormat> ] [, <cTimeFormat> ] ) -> <tTimeStamp> HB_TTOS( <tTimeStamp> ) -> <cYYYYMMDDHHMMSSFFF> HB_STOT( <cDateTime> ) -> <tTimeStamp> <cDateTime> should be in one of the above form: - "YYYYMMDDHHMMSSFFF" - "YYYYMMDDHHMMSSFF" - "YYYYMMDDHHMMSSF" - "YYYYMMDDHHMMSS" - "YYYYMMDDHHMM" - "YYYYMMDDHH" - "YYYYMMDD" - "HHMMSSFFF" - "HHMMSSF" - "HHMMSS" - "HHMM" - "HH" Important is number of digits. [/pre2]

Andrey: Haz пишет: Более того в ChangeLog.txt по Harbour эти функции прекрасно документированы Блин, а я искал по всему инету, вместо того чтобы первоисточник посмотреть... И поиск правильно нужно делать, я искал "HARBOUR hh:mm:ss"

Andrey: На сайте у вас есть: [pre2]3.13.6 Управление запуском процессов nResult := hb_ProcessRun( cCommand, [cStdIn], [@cStdOut], [@cStdErr], [lDetach] ) handle := hb_ProcessOpen( cCommand, [cStdIn], [@cStdOut], [@cStdErr], [lDetach] ) nResult := hb_ProcessValue( handle, [lWait] ) nResult := hb_ProcessClose( handle, lGentle ) [/pre2] А можно более подробнее дать параметры ? Я использую то что здесь на форуме давали: [pre2] hPID := hb_processOpen( cRun + " " + cParam,,,,.F., @hProcess) [/pre2] Может и неправильно... nResult := hb_ProcessClose( handle, lGentle ) - возвращает логическую переменную ! Не понял почему ?

alkresin: Описаний нигде нет, разобраться можно только по исходникам и примерам применения. handle := hb_ProcessOpen( cCommand, [cStdIn], [@cStdOut], [@cStdErr], [lDetach] ) Здесь cCommand - сама команда, cStdIn - то, что для этой команды вы бы ввели с клавиатуры, cStdOut и cStdErr - в эти переменные записывается вывод запускаемой программы, если он направлен в стандартные потоки stdout, stderr, lDetach - чтобы запустить процесс и не ждать его завершения, "отвязать" от своей программы, @hProcess - сюда записывается идентификатор процесса. hb_ProcessClose() возвращает результат - удалось ли нормально завершить процесс.

Andrey: alkresin пишет: hb_ProcessClose() возвращает результат - удалось ли нормально завершить процесс. Это я понял, просто наверное nResult нужно поменять на lResult ! А то получается, что ожидаешь число (N), и пишешь сразу в коде HB_NtoS(nResult) и получаешь пустоту....

alkresin: А... Ну да, надо будет исправить

Andrey: Ещё вопрос по вашей документации. Можно ли разместить отдельный пример работы с потоком с одной базой данных ? Не знаю как сделать у себя. Базу открываю монопольно, запускаются несколько потоков с РАЗНЫМИ RECNO(), нужно записать в базу по этим RECNO() что-то и потом завершить поток.

alkresin: Не получится. В документации написано, что workarea - локальные ресурсы потока, т.е., они не наследуются потоком. Для проверки написал вот это: Function Main LOCAL hThread IF hb_mtvm() ? "Start" ELSE ? "No threads support..." QUIT ENDIF select a use life exclusive hThread := hb_threadStart( @thFunc() ) hb_threadDetach( hThread ) Inkey(1) ? "End" return nil Function thFunc select a dbgoto( 3 ) ? field->EVENT return nil и оно не работает, потому что поток "не видит" открытую родителем базу. Да, вообще говоря, такой режим работы не очень эффективен. Если бы это работало, то надо было бы расставлять мьютексы: hb_mutexLock( mutex1 ) dbgoto( nRec ) field->MYFIELD := ... hb_mutexUnLock( mutex1 ) чтобы между dbgoto() и изменением записи другой поток не передвинул указатель записи в другое место. Так что вряд ли это получится быстрее, чем в одном потоке.

Andrey: Спасибо, понял ! А если открывать базу тогда в многопользовательском режиме ? Или вообще заново открывать базу в этом потоке, а потом закрывать. Будет тогда работать ? Мне не быстрота нужна, а независимость потока для записи в базу. Т.е. что то сделали в потоке и записали в базу. А в это время юзер может передвигаться по базе в основном потоке.

alkresin: Да, базу надо открывать в потоке в shared режиме, будет работать.

PSP: Andrey пишет: что то сделали в потоке и записали в базу. А в это время юзер может передвигаться по базе в основном потоке Нужно как-то отслеживать изменения. Иначе юзер может их и не увидеть.

Andrey: PSP пишет: Нужно как-то отслеживать изменения. Иначе юзер может их и не увидеть. Ну можно сделать Public nPubUpdateBase := 0 и из потока присваивать 1 при нужных условиях. А в главном потоке следить за этой переменной и делать Refresh базы если nPubUpdateBase == 1 Только как это реализовывать я не знаю ... Нужно как то блокировать переменную M->nPubUpdateBase ?

Haz: Andrey пишет: Ну можно сделать Public nPubUpdateBase := 0 и из потока присваивать 1 при нужных условиях. Поток используется чтобы не прерывать работу в основном процессе. Базы открываются в каждом потоке в режиме совместного доступа и логика точно такая же как и при работе с базой нескольких пользователей. Естественно в рамках работы в одной программе у нас есть вся информация о действиях "второго" пользователя и можно организовать хитрые рефреши если изменились записи из активного окна бровса, но на практике не заморачиваемся и все как при работе многопользовательской среде.. Если открывать базу в монопольном режиме, то eе нужно перемещать в zero space и забирать оттуда потоком при необходимости ( не забывая возвращать ) . Пока не забрали - алиас в потоке не увидим. У Александра все очень доступно написано о принципах работы с базой в многопоточке, никакие примеры не нужны. При монопольном доступе: Открыл базу и сразу в переместил в зеро. [pre2] #xcommand UNLOCK WORKAREA [] => hb_dbDetach( ) #xcommand LOCK WORKAREA => hb_dbRequest( , .T.,, .T. ) [/pre2] При необходимости забрал из зеро, поработал и вернул. Вот и вся хитрость. При многопользовательском: Все тоже как будто работает ещё другой пользователь. Можно в разных потоках открывать с одним и тем же алиасом, все равно он будет локальный и виден только в потоке ( как и все прочие установки RDD ) Ранее в xharbour потоком наследовались не только паблик переменные но и рабочие области, это приводило к тому, что приходилось вешать мютексы и запоминать установки RDD в рабочей области для их корректного восстановления. Позже и считаю правильным, наследование рабочей области убрали.

Andrey: В МиниГуи есть глобальные переменные: [pre2] App.Cargo := oHmgData() (App.Cargo):nTimerSec := 5 (App.Cargo):aClose := {} (App.Cargo):cFileDbf := GetStartUpFolder() + "\test.dbf" (App.Cargo):cAlias := "MyTest" [/pre2] И ещё можно делать на окно контейнер с нужными переменными: [pre2] DEFINE WINDOW wMain ; ..... This.Cargo := oHmgData() // for the window we create an object without variables (conditionally empty) This.Cargo:lRefresh := .F. nRecno := (cAls)->Lastrec() This.Cargo:oBrw := oBrw // положить объект TBROWSE на форму This.Cargo:aBrw := ARRAY(nRecno) AFILL( This.Cargo:aBrw, 0 )[/pre2] Если я запускаю поток: [pre2] hb_threadDetach( hb_threadStart( HB_THREAD_INHERIT_MEMVARS, @RunExternal(), aFile, oWnd ) ) [/pre2] То эти переменные доступны в потоке. Вопрос такой, если нужно записать в потоке допустим в [pre2] oWnd:Cargo:aBrw[25] := hPid или This.Cargo:lRefresh := .T. или AADD( (App.Cargo):aClose , {хендл окна, hPid, } )[/pre2] НУЖНО ли делать блокировку этих переменных ? Или лучше использовать обычные PUBLIC переменные ? Или делать через класс TThrData (доступ в потоках к переменным идет с блокировками) из МиниГуи ?

SergKis: Andrey пишет НУЖНО ли делать блокировку этих переменных ? Делай так (только используй h_objects.prg, в нем THmgData и TThrData max совмещены) [pre2] FUNCTION oThrData() RETURN TThrData():New() тогда App.Cargo := oThrData() (App.Cargo):nTimerSec := 5 (App.Cargo):aClose := {} (App.Cargo):cFileDbf := GetStartUpFolder() + "\test.dbf" (App.Cargo):cAlias := "MyTest" ... DEFINE WINDOW wMain ; ..... This.Cargo := oThrData() // for the window we create an object without variables (conditionally empty) This.Cargo:lRefresh := .F. nRecno := (cAls)->Lastrec() This.Cargo:oBrw := oBrw // положить объект TBROWSE на форму This.Cargo:aBrw := ARRAY(nRecno) AFILL( This.Cargo:aBrw, 0 ) [/pre2] тогда и к этим переменным App.Cargo, This.Cargo доступ будет с блокировками в потоках, не путать с oBrw := This.Cargo:oBrw, тут обычный доступ. Можно делать свою переменную для потоков PUBLIC oThread := oThrData() и работать в потоках через нее. Управлять окнами, тсб можно через сообщения окну (по уст. событиям)

alkresin: Обновил Harbour для начинающих - часть III - добавил раздел 3.13 Интернационализация (hbi18n)



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