Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#16: 2017-08-14 09:10:43 ЛС | профиль | цитата
Tad писал(а):
И ты знаешь - работало без проблем.
Знаю.
И еще знаю, что это не имеет никакого отношения к теме топика.

У ТС идет утечка памяти. Схема приведена.
В чем дело, коллеги

Видны из схемы и другие (кроме этой) проблемы:
1) Условие окончания цикла - возможно и ерунда, просто руки не дошли, и память кончается раньше.
2) Неумение отрисовывать форму на фоне "полной занятости" - лепит потоки не-пойми-куда.
3) Непонимание, что Str_Enum работает лишь с символом, а не с '\r\n'.
4) Не обозначенная, но прогнозируемая проблема парсинга, когда строка начинается в одной проекции, а кончается в другой.
Вообще-то, даже преобразование UTF8->ANSI предполагает законченную строку, а не ее кусочки.
Особо интересно было бы посмотреть на этот мазохизм с учетом "некоторых особенностей округления" у SharedStream.

Вот про это, было бы в тему.
НО -- продвинутые юзеры занимаются трепом НИ О ЧЕМ.
Вместо того, чтобы научить пользователя, ХОТЯ БЫ -- чем ЦИКЛ отличается от КОЛЬЦЕВАНИЯ.
И почему второе в HiAsm, в общем случае - недопустимо.



Мне просто любопытно уже, этого что - никто кроме меня не умеет на форуме
Типа - утерянные знания предыдущих цивилизаций...

Редактировалось 3 раз(а), последний 2017-08-14 11:00:20
карма: 9

0
Ответов: 125
Рейтинг: 6
#17: 2017-08-14 23:49:13 ЛС | профиль | цитата
Galkov, Спасибо за замечания, по ним подробно:
1. Действительно, окончание цикла не стал доделывать, т.к. удалил эту часть схему, при минимизации компонентов, когда искал в чём ошибка. Целью тогда было дойти до 100% без ошибки.
2. Да, есть у меня недопонимание, как правильно ставить поток. Читал, что не должно касаться визуальных элементов, но я не понял как это вообще возможно, ведь в конце данные идут на визуальную часть в итоге.
Из Справки
Не рекомендуется изменять внешний вид интерфейсных элементов из схемы, стоящей после метода doExec.
3. Да, я приметил, что он работает только с одним символом, но предполагал что перенос строки это один символ. Теперь знаю, что не один(Любопытно: А сколько, 2 или 4?)
4. Иногда замечаю, что в словах вопросы, это бывает редко, грешил на спецсимволы, может быть это от того, что
Galkov писал(а):
UTF8->ANSI предполагает законченную строку
?

nesco писал(а):
Я не считаю это доступным компонентом для каждого пользователя, и ты это прекрасно знаешь.
Я тоже считаю этот компонент недоступным для меня

Galkov писал(а):
чем ЦИКЛ отличается от КОЛЬЦЕВАНИЯ
Вроде как у цикла должно быть условие, а кольцевание до упора происходит?

Galkov писал(а):
Тому, что чего-то там у нас не успевает настолько, что надо ставить секундные задержки
Как же сделать правильно в итоге?
Как это выглядит у меня сейчас, без потока, так как с ним, что без него, видимо по причине неправильной вставки тоже лагало)
Add(MainForm,11176470,483,315)
{
Left=20
Top=105
Width=650
Height=599
Caption="FileMapVewer"
Position=1
Point(onClose)
}
Add(Hub,2606912,245,231)
{
OutCount=3
link(onEvent1,9843132:doExecute,[])
link(onEvent2,4206186:doWork1,[(354,244)])
link(onEvent3,15783663:doTimer,[(287,251)(287,188)])
}
Add(HubEx,4206186,350,350)
{
link(onEvent,554821:doEvent1,[])
}
Add(Hub,4964243,448,182)
{
OutCount=3
link(onEvent1,12437222:doRemapping,[(471,188)(471,220)(381,220)(381,244)])
link(onEvent2,4206186:doWork3,[(520,195)(520,394)(354,394)])
link(onEvent3,11127952:doData,[])
}
Add(SharedStream,12437222,392,231)
{
PageMem=1024
Point(FileSize)
Point(FileOffset)
Point(Granularity)
link(Offset,6449920:Result,[])
}
Add(Math,6449920,406,182)
{
Point(doClear)
link(onResult,4964243:doEvent1,[])
link(Op1,8008760:Var1,[(412,170)])
link(Op2,12437222:SizeMMF,[(419,165)(370,165)(370,270)(412,270)])
}
Add(Charset,786843,476,357)
{
Type=7
link(onCharset,10833509:doEnum,[])
}
Add(Str_Enum,10833509,525,357)
{
Delimiter="\r\n"
OnlyDivGroup=1
link(onEnum,16079826:doCompare,[])
}
Add(Memo,8054800,749,371)
{
Top=20
Width=634
Height=540
Align=4
Font=[Courier New,8,0,0,204]
AddType=1
ScrollBars=3
}
Add(StrMask,16079826,567,357)
{
Mask="??'*,*,*,*"
link(onFalse,16699208:doCompare,[])
link(onTrue,12046379:doWork2,[(605,370)(605,433)])
}
Add(StrMask,16699208,609,357)
{
Mask="*);"
link(onFalse,7063780:doValue,[(650,363)(650,335)])
link(onTrue,15765640:doStrCat,[(649,370)(649,377)])
}
Add(StrCat,15765640,658,371)
{
link(onStrCat,8696848:doCompare,[])
link(Str1,7063780:Value,[])
}
Add(Memory,7063780,658,329)
{
}
Add(StrMask,8696848,700,371)
{
Mask="??'*,*,*,*"
link(onFalse,8054800:doAdd,[])
link(onTrue,12046379:doWork1,[(739,384)])
}
Add(Button,2506679,203,231)
{
link(onClick,2606912:doEvent1,[])
}
Add(StreamConvertor,7318274,392,357)
{
Mode=6
Point(Data)
link(onResult,786843:doCharset,[])
link(Data,12437222:Stream,[])
}
Add(Hub,554821,364,350)
{
link(onEvent1,13850635:doCalc,[(392,356)(392,286)])
link(onEvent2,7318274:doConvert,[])
}
Add(ProgressBar,9114966,483,280)
{
Left=110
Width=525
}
Add(MathParse,13850635,413,280)
{
MathStr="%2 * 100 / %1"
ResultType=0
link(onResult,15947962:doEvent1,[])
link(X1,12437222:FileSize,[])
link(X2,6373356:Var2,[])
}
Add(GetDataEx,6373356,420,266)
{
link(Data,12437222:FileOffset,[])
}
Add(Hub,15947962,455,280)
{
link(onEvent1,9114966:doPosition,[])
link(onEvent2,11176470:doCaption,[(476,293)(476,321)])
}
Add(ODialog,9843132,294,231)
{
link(onExecute,12437222:doOpen,[])
}
Add(Button,8288703,245,189)
{
Left=55
link(onClick,12453247:doWork2,[])
}
Add(DoData,16060613,749,427)
{
}
Add(HubEx,12046379,735,427)
{
link(onEvent,16060613:doData,[])
}
Add(Timer,15783663,329,182)
{
Interval=0
Enable=1
link(onTimer,6449920:doOperation,[])
}
Add(DoData,11127952,490,196)
{
link(onEventData,14388698:doCase,[])
link(Data,8008760:Var3,[(496,170)])
}
Add(Case,14388698,539,196)
{
DataOnTrue=String(Достигнут конец файла)
link(onTrue,12453247:doWork3,[(583,209)(583,165)(305,165)])
}
Add(HubEx,12453247,301,189)
{
link(onEvent,15783663:doStop,[])
}
Add(GetDataEx,8008760,475,165)
{
Angle=2
link(Data,6373356:Var3,[(481,271)])
}

Редактировалось 7 раз(а), последний 2017-08-15 00:20:47
карма: 0

0
Ответов: 9906
Рейтинг: 351
#18: 2017-08-15 10:39:21 ЛС | профиль | цитата
mrumbert писал(а):
Вроде как у цикла должно быть условие, а кольцевание до упора происходит?

Давайте с самого начала. С базовых основ HiAsm.
В "модели паровозиков", предположим.

Вообразим себе, что каждый элемент это некоторая ЖД-станция со своими индивидуальными протоколами/спецификациями/расписанием жизнедеятельности.
И эти станции соединены ЖД-путями, которые и отражают нашу схему.
Спрашивается, как должна проистекать жизнь в этом воображаемом мире, чтобы это максимально соответствовало реально происходящему в наших кодах.
Так вот, все начинается с некой станции, в протоколах которой прописана собственная активность - по одному из путей (правая или верхняя точка) отправляется паровозик, доставляющий некоторый груз (данные) другой станции (элементу).
В протоколах большинства наших станций (элементов) не прописана собственная активность и находятся они в режиме ожидания. Но они все начинают жизнедеятельность по получении груза по одному из своих входов (левая или нижняя точка). Эта жизнедеятельность может быть незаметной (без внешних проявлений), а может быть достаточно бурной - станция начинает отправлять уже свой паровозик к другим станциям. Этот свой паровозик хоть и один, но может отправляться неоднократно, и по разным путям, передавая грузы другим станциям, или наоборот - получая их от других.

В чем заключается главное заблуждение: представление о том, что по схеме бегает только один паровозик по путям, проложенным в схеме -- НЕПРАВИЛЬНОЕ.
Все немного по другому. Их много, свой у каждой станции.
Да, некоторая станция отправила паровозик на другую. И она ждет его обратно. И только когда он вернется, станция продолжит исполнять свой протокол (расписание, если хотите). А паровозик, который был отправлен, вовсе не путешествует далее по схеме, а стоит и ждет, пока его отпустит станция-адресат. Занимая путь, между прочим.
А эта станция-адресат имеет свой паровозик, и свою жизнедеятельность отражает в том, что уже его (а не тот, который привез задание к исполнению) отправляет по путям в соответствии со схемой и своим расписанием. И этот паровозик тоже будет занимать путь, пока уже другие станции (погонявши по схеме свои паровозики) не отпустят его.
Так вот, если какая-то станция отправит паровозик на уже занятый путь - будет крушение.
Грубо говоря поведение схемы непредсказуемо. Может быть все что хочешь - просто неправильное поведение элемента, сопровождаемое вопросами на форуме; падение (типа AV) схемы; утечка памяти, как в Вашем случае. А иногда это и работает (у нас заложен некоторый запас прочности).

Давайте посмотрим Вашу первую схему (как более простую), и обозначим последовательно занимаемые ЖД-пути: ODialog.onExecute -> Hub.onEvent2 -> Hub.onEvent2 -> StreamConvertor.onResult -> Charset.onCharset -> Str_Enum.onEndEnum -> Math.onResult -> Hub.onEvent2 <<-- Оппаньки, а этот путь уже занят, там ожидает окончания всего этого безобразия паровозик, второй из вышеозначенного списка.

Вот так делать и нельзя. Если, конечно же - хочешь, чтобы оно работало. И такое столкновение паровозиков и называется КОЛЬЦЕВАНИЕМ.
А ЦИКЛ - это когда в расписании ЖД-станции записано отправление паровозика по одному и тому же пути. Отправил - дождался возврата, и снова отправил. Снова дождался - и отправил опять. И т.д.. А уж количество отправлений, условие окончание, или бесконечный цикл - это второй вопрос.

mrumbert писал(а):
Как же сделать правильно в итоге?

Применяя элементы, которые умеют делать цикл.
К примеру, в одном потоке (там же смотри "оживление формы"):
Пример с 1-м потоком

Add(Hub,2606912,140,189)
{
OutCount=3
link(onEvent1,6449920:doClear,[(459,195)(459,104)])
link(onEvent2,12437222:doOpen,[(179,202)(179,146)])
link(onEvent3,12675296:doRepeat,[])
}
Add(SharedStream,12437222,483,140)
{
PageMem=1024
Point(FileSize)
Point(FileOffset)
link(Offset,6449920:Result,[])
}
Add(Math,6449920,497,91)
{
Point(doClear)
link(onResult,12437222:doRemapping,[(536,97)(536,132)(473,132)(473,153)])
link(Op1,12437222:SizeMMF,[(503,82)(468,82)(468,187)(503,187)])
link(Op2,6373356:Var3,[(510,82)(545,82)(545,187)])
}
Add(Charset,786843,322,56)
{
Type=7
link(onCharset,15530269:doEvent1,[])
}
Add(Button,2506679,42,189)
{
Left=14
Top=14
link(onClick,9843132:doExecute,[])
}
Add(StreamConvertor,7318274,273,56)
{
Mode=6
link(onResult,786843:doCharset,[])
link(Data,12437222:Stream,[(279,47)(314,47)(314,180)(489,180)])
}
Add(ProgressBar,9114966,595,175)
{
Left=82
Top=14
Width=525
}
Add(MathParse,13850635,504,210)
{
MathStr="%2 * 100 / %1"
ResultType=0
link(onResult,15947962:doEvent1,[])
link(X1,12437222:FileSize,[])
link(X2,6373356:Var2,[])
}
Add(GetDataEx,6373356,511,182)
{
link(Data,12437222:FileOffset,[])
}
Add(Hub,15947962,553,210)
{
link(onEvent1,9114966:doPosition,[(578,216)(578,181)])
link(onEvent2,5675648:doCaption,[])
}
Add(ODialog,9843132,91,189)
{
link(onExecute,2606912:doEvent1,[])
}
Add(StyleXP,4708911,42,133)
{
}
Add(Application,12592788,266,217)
{
Wait=1
Point(onTerminate)
link(onTerminate,12675296:doStop,[(305,223)(305,258)(172,258)(172,216)])
}
Add(StrList,9981264,406,35)
{
}
Add(Hub,15530269,371,56)
{
link(onEvent1,9981264:doText,[])
link(onEvent2,16414418:doEnum,[(396,69)(396,90)])
}
Add(ArrayEnum,16414418,420,84)
{
link(onItem,7154492:doWork,[(459,90)(459,62)])
link(onEndEnum,6449920:doOperation,[])
link(Array,9981264:Array,[])
}
Add(Repeat,12675296,182,203)
{
Type=4
Op2=Integer(100)
Check=1
link(onRepeat,894652:doEvent1,[])
link(Op1,13850635:Result,[(188,187)(314,187)(314,250)(510,250)])
}
Add(Hub,894652,231,203)
{
OutCount=3
link(onEvent1,7318274:doConvert,[(263,209)(263,62)])
link(onEvent2,13850635:doCalc,[])
link(onEvent3,12592788:doProcessMessages,[])
}
Add(LineBreakEx,7154492,553,56)
{
Caption="Enum_Lines"
}
Add(MainForm,5675648,595,217)
{
Left=20
Top=105
Width=641
Height=90
Caption="FileMapVewer"
Position=1
Point(onClose)
}
Можно и Thread применить (работать в два потока), он тоже стреляет бесконечным циклом:
Пример с 2-мя потоками

Add(MainForm,11176470,595,175)
{
Left=20
Top=105
Width=641
Height=90
Caption="FileMapVewer"
Position=1
Point(onClose)
}
Add(Hub,2606912,182,182)
{
OutCount=3
link(onEvent1,6449920:doClear,[(459,188)(459,97)])
link(onEvent2,12437222:doOpen,[(207,195)(207,139)])
link(onEvent3,11926819:doStart,[])
}
Add(SharedStream,12437222,483,133)
{
PageMem=1024
Point(FileSize)
Point(FileOffset)
link(Offset,6449920:Result,[])
}
Add(Math,6449920,497,84)
{
Point(doClear)
link(onResult,12437222:doRemapping,[(536,90)(536,125)(473,125)(473,146)])
link(Op1,12437222:SizeMMF,[(503,75)(468,75)(468,180)(503,180)])
link(Op2,6373356:Var3,[(510,75)(545,75)(545,180)])
}
Add(Charset,786843,322,49)
{
Type=7
link(onCharset,15530269:doEvent1,[])
}
Add(Button,2506679,84,182)
{
Left=14
Top=14
link(onClick,9843132:doExecute,[])
}
Add(StreamConvertor,7318274,273,49)
{
Mode=6
link(onResult,786843:doCharset,[])
link(Data,12437222:Stream,[(279,40)(314,40)(314,173)(489,173)])
}
Add(ProgressBar,9114966,595,133)
{
Left=82
Top=14
Width=525
}
Add(MathParse,13850635,504,203)
{
MathStr="%2 * 100 / %1"
ResultType=0
link(onResult,15947962:doEvent1,[])
link(X1,12437222:FileSize,[])
link(X2,6373356:Var2,[])
}
Add(GetDataEx,6373356,511,175)
{
link(Data,12437222:FileOffset,[])
}
Add(Hub,15947962,553,203)
{
OutCount=3
link(onEvent1,9114966:doPosition,[(578,209)(578,139)])
link(onEvent2,11176470:doCaption,[(585,216)(585,181)])
link(onEvent3,15637114:doCompare,[])
}
Add(ODialog,9843132,133,182)
{
link(onExecute,2606912:doEvent1,[])
}
Add(StyleXP,4708911,84,133)
{
}
Add(If_else,15637114,595,217)
{
Type=1
Op2=Real(100)
link(onFalse,11926819:doStop,[(634,230)(634,258)(207,258)(207,209)])
}
Add(StrList,9981264,406,28)
{
}
Add(Hub,15530269,371,49)
{
link(onEvent1,9981264:doText,[])
link(onEvent2,16414418:doEnum,[(396,62)(396,83)])
}
Add(ArrayEnum,16414418,420,77)
{
link(onItem,7154492:doWork,[(459,83)(459,55)])
link(onEndEnum,6449920:doOperation,[])
link(Array,9981264:Array,[])
}
Add(LineBreakEx,7154492,553,49)
{
Caption="Enum_Lines"
}
Add(Thread,11926819,217,196)
{
Delay=0
link(onExec,7318274:doConvert,[(263,202)(263,55)])
link(onSyncExec,13850635:doCalc,[])
}


--- Добавлено в 2017-08-15 10:41:58
Про разбиение строки на части по-позже обсудим...
Сами пока думайте (ибо мне на работу пора)

Редактировалось 12 раз(а), последний 2017-08-15 23:19:06
карма: 9

0
Ответов: 43
Рейтинг: -2
#19: 2017-08-15 21:51:22 ЛС | профиль | цитата
Tad писал(а):
andrestudioEX, ты чего EX добавил ?

могу убавить, глюки форума от этого не изменятся.
карма: -2

0
Ответов: 125
Рейтинг: 6
#20: 2017-08-16 00:24:29 ЛС | профиль | цитата
Galkov, спасибо огромное за подробное наглядное объяснение! Даёт ответы на многие вопросы)
Galkov писал(а):
главное заблуждение

Действительно главное)

Даже смешно, что я пытался таймером цикл заменить))
А что, если теоретически оба паровозика захотят заехать на одну станцию(обратиться к одному элементу из двух потоков)? Возможна ли авария?
карма: 0

0
Ответов: 9906
Рейтинг: 351
#21: 2017-08-16 09:50:51 ЛС | профиль | цитата
Да, конечно.
С потоками еще сложнее. Можно попытаться безобидно (как бы с свободного пути) прочитать из другого потока данные элемента (например Math.Result), в то время, как основной поток может заниматься вычислениями по doOperation.
Есть вероятность, что одна половинка Real-данных будет от старых данных, а одна от новых. А вместе - бред сивой кобылы.
И называется это конфликт данных.
В итоге -- вроде прекрасно работает программа... Но раз в месяц фигню какую-то выдает. И пойди найди потом ошибку.
Дешевле, таких глупостей не делать сразу. Чем потом потом месяцами чесать в репе.

Для многопоточных задач существуют виндячие техники синхронизации потоков. Ну это уже отдельный разговор
карма: 9

0
Ответов: 125
Рейтинг: 6
#22: 2017-08-16 23:15:54 ЛС | профиль | цитата
Кстати говоря, полностью исчезли ошибки, а я думал, что в файле есть неправильные записи) Незнание порождает большее незнание
Galkov, короче говоря, огромное спасибище! Переделал несколько проектов, избавил от таймеров и потоков лишних. Если бы не Вы, то я бы до упора вместо цикла таймер использовал

Редактировалось 1 раз(а), последний 2017-08-16 23:16:59
карма: 0

0
Ответов: 9906
Рейтинг: 351
#23: 2017-08-20 17:20:47 ЛС | профиль | цитата
Galkov писал(а):
Про разбиение строки на части по-позже обсудим...

Сколько символов содержит перевод строки, вопрос запутанный до безобразия. И поэтому, зависит от "производителя"
Объектная библиотека (TStream.ReadStr) предполагает 5 вариантов "окончания строки", которые безусловно выдергиваются из файла: <EOF>, #0, #10, #13#10, и одиночный #13 (если после #13 не идет символ #10)
В винде обычно это два символа #13#10, и, записывая, мы именно эти два символа и вставляем.

А кодировка UTF-8 может кодировать один символ -- до 6-ти байт. Хотя русским буквам достаточно и двух. А для UTF-16 будет достаточно и трех байт.
В этом деле главное, что больше одного, и никто не обещал, что они не будут разрезаны на части левым краем проекции. Который всеобязательно кратен 64К (так пожелал nesco).

Мои соображения по этому поводу заключаются в следующем.
Если мы можем ограничить длину строки для парсинга (например, 1 метром), тогда мы могли бы размер проекции сделать с запасом (5 метров), а в цикле менять Offset по прежнему на 4 метра.
Строка выскочила за 4-х метровую границу - заканчиваем с этой проекцией, и делаем следующую.
Но эту последнюю (выскочившую) строку мы прочитали верно (если она не длиннее нашего запаса)
Правда, на следующей проекции мы должны переустановить позицию стрима на размер этого "выскока"
((ИБО, прибавить по простому Stream.Position к SharedStream.FileOffset - не получится, в связи с вышеупомянутыми "особенностями округления"))

Например, таким образом:
Пример проекции "с метровым запасом"

Add(Hub,2606912,147,161)
{
OutCount=4
link(onEvent1,12714162:doClear,[(172,167)(172,69)])
link(onEvent2,6449920:doClear,[])
link(onEvent3,12437222:doOpen,[(270,181)(270,237)])
link(onEvent4,12675296:doRepeat,[(172,188)(172,230)])
}
Add(SharedStream,12437222,329,231)
{
PageMem=1280
Point(FileSize)
Point(FileOffset)
link(Offset,6449920:Result,[])
AddHint(24,-20,39,13,PageMem)
}
Add(Math,6449920,343,161)
{
Op2=4194304
Point(doClear)
link(onResult,13850635:doCalc,[])
link(Op1,12437222:FileOffset,[(349,152)(384,152)(384,271)(363,271)])
AddHint(7,-35,66,13,Op2)
}
Add(Charset,786843,532,49)
{
Type=7
link(onCharset,7154492:doWork,[])
}
Add(Button,2506679,49,161)
{
Left=14
Top=14
link(onClick,9843132:doExecute,[])
}
Add(ProgressBar,9114966,532,126)
{
Left=82
Top=14
Width=525
}
Add(MathParse,13850635,399,161)
{
MathStr="%2 * 100 / %1"
ResultType=0
link(onResult,15947962:doEvent1,[])
link(X1,12437222:FileSize,[(405,152)(391,152)(391,278)(356,278)])
}
Add(Hub,15947962,490,161)
{
link(onEvent1,9114966:doPosition,[(515,167)(515,132)])
link(onEvent2,7791365:doCaption,[])
}
Add(ODialog,9843132,98,161)
{
link(onExecute,2606912:doEvent1,[])
}
Add(Application,12592788,266,245)
{
Wait=1
Point(onTerminate)
link(onTerminate,12675296:doStop,[(305,251)(305,286)(172,286)(172,237)])
}
Add(Repeat,12675296,182,224)
{
Type=4
Op2=Integer(100)
Check=1
link(onRepeat,894652:doEvent1,[])
link(Op1,13850635:Result,[(188,208)(405,208)])
}
Add(Hub,894652,231,224)
{
OutCount=4
link(onEvent1,12018389:doEvent1,[(256,230)(256,48)])
link(onEvent2,6449920:doOperation,[(263,237)(263,167)])
link(onEvent3,12437222:doRemapping,[])
link(onEvent4,12592788:doProcessMessages,[])
}
Add(LineBreakEx,7154492,581,49)
{
Caption="Enum_Lines"
}
Add(MainForm,7791365,532,168)
{
Left=20
Top=105
Width=641
Height=90
Caption="FileMapVewer"
Position=1
Point(onClose)
}
Add(Repeat,2979535,364,49)
{
Type=1
Op2=Real(4194304)
link(onRepeat,16078775:doCompare,[])
link(Op1,9541802:Var2,[])
AddHint(8,-37,66,13,Op2)
}
Add(Hub,12018389,266,42)
{
OutCount=3
link(onEvent1,2128108:doData,[(291,48)(291,104)])
link(onEvent2,2979535:doRepeat,[])
link(onEvent3,12714162:doOperation,[])
}
Add(Math,12714162,308,56)
{
OpType=1
Op2=4194304
Point(doClear)
link(Op1,9541802:Var1,[(314,33)])
AddHint(-21,-44,66,13,Op2)
}
Add(GetDataEx,9541802,364,28)
{
Angle=1
link(Data,12838482:Var1,[])
}
Add(DoData,2128108,308,98)
{
link(onEventData,1906853:doPosition,[(473,104)(473,69)])
link(Data,12714162:Result,[])
}
Add(If_else,16078775,413,49)
{
Type=1
link(onTrue,1906853:doGet,[(473,55)(473,62)])
link(onFalse,2979535:doStop,[(452,62)(452,90)(354,90)(354,62)])
link(Op1,12838482:Var2,[])
link(Op2,12437222:SizeMMF,[(426,40)(461,40)(461,285)(349,285)])
}
Add(GetDataEx,12838482,413,28)
{
Angle=1
link(Data,1906853:Position,[(503,33)(503,89)(496,89)])
}
Add(DataToFile,1906853,483,49)
{
Type=7
Point(Position)
Point(doPosition)
link(onGet,786843:doCharset,[])
link(Stream,12437222:Stream,[(489,40)(468,40)(468,292)(335,292)])
}

Редактировалось 4 раз(а), последний 2017-08-21 17:55:59
карма: 9

0
Ответов: 9906
Рейтинг: 351
#24: 2017-08-21 19:56:51 ЛС | профиль | цитата
Упс.....
В предыдущей схеме ошибка (исправленная) -- надо установить в DataToFile.Type=dtLines, конечно же



nesco, вот чего я заметил, просматривая возможность замены DataToFile на DataToFileEx в последней схеме:
  • Нижняя точка Position есть, а Size - нету. Несправедливо как-то...
  • Методы dtAnsiString и dtLines - тупо скопированы, и - работают, конечно же. А вот ошибок чтения/записи - не генерируют правильно (тупо позабыл).
Поэтому предлагаю фиксинг. Посмотри, пожалуйста.
Кстати, ошибки чтения для этих методов возможны только в одном случае - конец файла (прочитано 0 байт). А иначе, прочитается, как минимум, какой-нибудь терминальный символ.

Поэтому, вышеозначенную схему можно было бы упростить чуток:
Пример с DataToFileEx

Add(DataToFileEx,9746904,420,49)
{
Type=4
Point(doPosition)
Point(Position)
Point(onRdError)
link(onGet,786843:doCharset,[])
link(Stream,12437222:Stream,[(426,40)(440,40)(440,285)(335,285)])
link(onRdError,2979535:doStop,[(459,62)(459,97)(354,97)(354,62)])
}
Add(Hub,2606912,147,161)
{
OutCount=4
link(onEvent1,12714162:doClear,[(172,167)(172,69)])
link(onEvent2,6449920:doClear,[])
link(onEvent3,12437222:doOpen,[(270,181)(270,237)])
link(onEvent4,12675296:doRepeat,[(172,188)(172,230)])
}
Add(SharedStream,12437222,329,231)
{
PageMem=1280
Point(FileSize)
Point(FileOffset)
link(Offset,6449920:Result,[])
AddHint(24,-20,39,13,PageMem)
}
Add(Math,6449920,343,161)
{
Op2=4194304
Point(doClear)
link(onResult,13850635:doCalc,[])
link(Op1,12437222:FileOffset,[(349,152)(384,152)(384,271)(363,271)])
AddHint(7,-35,66,13,Op2)
}
Add(Charset,786843,490,49)
{
Type=7
link(onCharset,7154492:doWork,[])
}
Add(Button,2506679,49,161)
{
Left=14
Top=14
link(onClick,9843132:doExecute,[])
}
Add(ProgressBar,9114966,490,126)
{
Left=82
Top=14
Width=525
}
Add(MathParse,13850635,399,161)
{
MathStr="%2 * 100 / %1"
ResultType=0
link(onResult,15947962:doEvent1,[])
link(X1,12437222:FileSize,[(405,152)(391,152)(391,278)(356,278)])
}
Add(Hub,15947962,448,161)
{
link(onEvent1,9114966:doPosition,[(473,167)(473,132)])
link(onEvent2,5675648:doCaption,[])
}
Add(ODialog,9843132,98,161)
{
link(onExecute,2606912:doEvent1,[])
}
Add(Application,12592788,266,245)
{
Wait=1
Point(onTerminate)
link(onTerminate,12675296:doStop,[(305,251)(305,286)(172,286)(172,237)])
}
Add(Repeat,12675296,182,224)
{
Type=4
Op2=Integer(100)
Check=1
link(onRepeat,894652:doEvent1,[])
link(Op1,13850635:Result,[(188,208)(405,208)])
}
Add(Hub,894652,231,224)
{
OutCount=4
link(onEvent1,12018389:doEvent1,[(256,230)(256,48)])
link(onEvent2,6449920:doOperation,[(263,237)(263,167)])
link(onEvent3,12437222:doRemapping,[])
link(onEvent4,12592788:doProcessMessages,[])
}
Add(LineBreakEx,7154492,539,49)
{
Caption="Enum_Lines"
}
Add(MainForm,5675648,490,168)
{
Left=20
Top=105
Width=641
Height=90
Caption="FileMapVewer"
Position=1
Point(onClose)
}
Add(Repeat,2979535,364,49)
{
Type=1
Op2=Real(4194304)
link(onRepeat,9746904:doGet,[])
link(Op1,9541802:Var2,[])
AddHint(8,-37,66,13,Op2)
}
Add(Hub,12018389,266,42)
{
OutCount=3
link(onEvent1,2128108:doData,[(291,48)(291,104)])
link(onEvent2,2979535:doRepeat,[])
link(onEvent3,12714162:doOperation,[])
}
Add(Math,12714162,308,56)
{
OpType=1
Op2=4194304
Point(doClear)
link(Op1,9541802:Var1,[(314,33)])
AddHint(-21,-44,66,13,Op2)
}
Add(GetDataEx,9541802,364,28)
{
Angle=1
link(Data,9746904:Position,[(412,33)(412,89)(433,89)])
}
Add(DoData,2128108,308,98)
{
link(onEventData,9746904:doPosition,[(403,104)(403,69)])
link(Data,12714162:Result,[])
}

Редактировалось 1 раз(а), последний 2017-08-21 20:05:45
карма: 9

0
файлы: 1DataToFileEx.rar [2.9KB] [538]
Разработчик
Ответов: 26061
Рейтинг: 2120
#25: 2017-08-21 21:41:19 ЛС | профиль | цитата
Galkov писал(а):
Поэтому предлагаю фиксинг

Пофиксил
карма: 22

0
Ответов: 4621
Рейтинг: 746
#26: 2017-08-22 10:53:47 ЛС | профиль | цитата
Galkov писал(а):
Поэтому предлагаю фиксинг.
Предлагаю добавить возможность записи строки без всяких окончаний и префиксов и чтение строки указанной длины. Также можно поправить метод doPosition для установки позиции за предел 2 Гб.
карма: 26

0
Ответов: 9906
Рейтинг: 351
#27: 2017-08-22 13:54:28 ЛС | профиль | цитата
Netspirit писал(а):
Предлагаю добавить возможность записи строки без всяких окончаний и префиксов и чтение строки указанной длины
Меня пока StreamCopy устраивал...
Обсуждать его доработки было бы логичнее.

Netspirit писал(а):
Также можно поправить метод doPosition для установки позиции за предел 2 Гб.
Предложи как, и у кого - и станет понятен объем геморроя.
Сразу же появится и предмет обсуждения.

Редактировалось 2 раз(а), последний 2017-08-22 13:55:56
карма: 9

0
Ответов: 4621
Рейтинг: 746
#28: 2017-08-22 14:46:32 ЛС | профиль | цитата
Galkov писал(а):
Меня пока StreamCopy устраивал...
Ага. На безрыбье и Дед Мороз - Снегурочка.


Galkov писал(а):
Предложи как

procedure SetStreamPosition(st: PStream; NewPos: Integer);
begin
if NewPos < 0 then
begin
st.Seek($7FFFFFFF, spBegin); // Устанавливаем на 2 Гб от начала
st.Seek(Cardinal(NewPos)-$7FFFFFFF, spCurrent); // Затем смещаем на нужную величину вверх от текущей
end
else
st.Seek(NewPos, spBegin);
end;

Редактировалось 2 раз(а), последний 2017-08-22 14:49:44
карма: 26

0
Ответов: 125
Рейтинг: 6
#29: 2017-08-28 23:16:35 ЛС | профиль | цитата
Galkov, Спасибо, работает замечательно, хоть и немножко медленнее)
карма: 0

0
Ответов: 9906
Рейтинг: 351
#30: 2017-08-29 17:54:18 ЛС | профиль | цитата
Со скоростью - ДА, проблемы.
Производил эксперимент: накопировал Kol.pas в режиме Append (в Far-е)
Получился файл размером 8399344692 байт, содержащий 4181 копию оригинального файла (размером 2008932, с количеством строк 64291)
Так это дело у меня -- чуть больше часа вертелось ...
Проверял (ошибаются все, и я - тоже) алгоритм на отсутствие "левых" строк, не содержащихся в оригинале.

Возможно, библиотечный метод TStream.ReadStr шибко медленно работает (читает по одному байту, накапливая их в строку).
Над элементом Str_Enum мы трудились в плане быстродействия (кажется Tad хай поднимал - не помню точно).

Подумаю над этим (в плане IC в стиле Str_Enum). НО - не сегодня. Если будут заметные улучшения -- обязательно сообщу.
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)