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)
}
Пример с 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
Про разбиение строки на части по-позже обсудим...
Сами пока думайте (ибо мне на работу пора)