Вверх ↑
Ответов: 1925
Рейтинг: 172
#1: 2019-09-10 12:48:58 ЛС | профиль | цитата
Igor08 писал(а):
Мне надо чтобы моя программа по моей схеме работала, а у меня получается кольцевание, а как без него не знаю.


Вставлю свои 5 коп.
Add(Button,7259507,189,84)
{
Left=45
Top=45
Caption="Цикл"
link(onClick,5142495:doFor,[])
}
Add(For,5142495,245,84)
{
End=100000
link(onEvent,13769529:doWork2,[])
}
Add(Button,190918,168,161)
{
Left=45
Top=70
Caption="кОльцо"
link(onClick,6776307:doWork2,[])
}
Add(CounterEx,7533547,252,161)
{
Max=100000
link(onNext,6422682:doEvent1,[])
}
Add(Label,11318150,392,84)
{
Left=165
Top=40
}
Add(HubEx,13769529,371,84)
{
link(onEvent,11318150:doText,[])
}
Add(Hub,6422682,308,161)
{
link(onEvent1,13769529:doWork3,[(375,167)])
link(onEvent2,1295603:doCompare,[])
}
Add(HubEx,6776307,231,161)
{
link(onEvent,7533547:doNext,[])
}
Add(If_else,1295603,336,168)
{
Type=1
Op2=Integer(100000)
link(onTrue,6776307:doWork3,[(380,174)(380,208)(235,208)])
}
Вот те пример цикла и кольцевания. Цикл провёл итерацию, освободил от неё стек и только затем запускает новую.
Кольцевание: поток пошёл на выполнение, он занимает память, и чтобы её освободить, нужно пройти до конца по всем веткам (линиям связи) потока. Но одна из веток запускает копию этого потока! И пока копия не отработает, первый поток (оригинал) не освободит стек. А копия, вместо того чтобы отработать и выгрузиться, запускает третью копию и так далее. Стек переполняется - программа вылетает.

Igor08 писал(а):
Может написать какой-то элемент или дописать в какой-то элемент в Hiasm 4, чтобы кольцевание можно было использовать.

Чтобы такого не было, надо запускать копию потока не из самого потока, т.е. отложить вызов копии, а самому потоку дать завершиться. У нас есть компонент для этого - DefferedEvent.
Add(Button,7259507,189,84)
{
Left=45
Top=45
Caption="Цикл"
link(onClick,5142495:doFor,[])
}
Add(For,5142495,245,84)
{
End=100000
link(onEvent,13769529:doWork2,[])
}
Add(Button,190918,168,161)
{
Left=45
Top=70
Caption="кОльцо"
link(onClick,6776307:doWork2,[])
}
Add(CounterEx,7533547,252,161)
{
Max=100000
link(onNext,6422682:doEvent1,[])
}
Add(Label,11318150,392,84)
{
Left=165
Top=40
}
Add(HubEx,13769529,371,84)
{
link(onEvent,11318150:doText,[])
}
Add(Hub,6422682,308,161)
{
link(onEvent1,13769529:doWork3,[(375,167)])
link(onEvent2,1295603:doCompare,[])
}
Add(HubEx,6776307,231,161)
{
link(onEvent,7533547:doNext,[])
}
Add(If_else,1295603,336,168)
{
Type=1
Op2=Integer(100000)
link(onTrue,14031848:doDeferredEvent,[])
}
Add(DeferredEvent,14031848,392,168)
{
link(onDeferredEvent,6776307:doWork3,[(439,174)(439,212)(235,212)])
}
С ним и кольцевание заработает, потому что это уже и не кольцевание вовсе - поток-то завершает работу, а копия запускается не из самого потока.

Это так же, как нельзя удалить копию динамического мультика из самого мультика или остановить поток Thread из него самого.

Надеюсь, правильно и не сильно запутанно объяснил. Кольцуйте на здоровье!
карма: 9
0
Редактировалось 1 раз(а), последний 2019-09-10 12:55:26