Вверх ↑
Ответов: 4612
Рейтинг: 746
#1: 2020-01-14 16:53:11 ЛС | профиль | цитата
Ещё и я свои 5 копеек вставлю.
Igor08 писал(а):
Если у меня программа вылетает при кольцевании с ошибкой c0000005, наверно тогда переполняется стек вызовов функций или теряется связь с данными? Возможно этот стек как-то очистить?
Кольцевание НЕЛЬЗЯ использовать. Точка. Тогда такой ошибки не будет.
Igor08 писал(а):
Такая ошибка появляется, если не использовать DeferredEvent. С этим элементом программа работает до определенного момента, потом не выполняет расчеты до конца.
По причине вышеприведенного DeferredEvent не является решением. Кроме того, DeferredEvent может пропускать события. Например, ты вызвал его 100 раз, а событие произойдёт 50 раз.
Igor08 писал(а):
А после hub они выполняются почти параллельно, одновременно можно сказать? Или пока по одной ветки все не выполнится после hub, другая выполнятся не будет?
Именно так. Если к какому-то событию (правой точке) хаба подключена цепочка компонентов (метод-событие-метод-событие-метод), то следующее событие хаба не произойдёт, пока все эти точки не отработают по очереди слева направо. Более того, в этот момент (параллельно) никакие другие события (горизонтальные связи) не работают, в том числе DeferredEvent, Timer (кроме MMTimer, Thread и некоторых других компонентов). Сам хаб активируется линией, входящей в него слева. Она тоже не завершится, пока хаб не отработает полностью. Так работают и другие компоненты, в которых событие (правая точка) является результатом вызова метода (левой точки) этого же компонента (смотреть описание методов и событий - там указывается когда происходит событие).

Igor08 писал(а):
Надо чтобы в программе много раз выполнялись одни и те же элементы.
"Много раз" - это сколько?
Если есть ответ "сколько" в виде числа - значит используется компонент For вкладки "Логика". Если ответа "сколько" нету, то должен быть ответ "а когда следует прекратить повторять?". В этом случае используется компонент Repeat с проверкой условия в нём самом, либо условие ставится "1=1" ("повторять бесконечно"), а проверка условий для прекращения повтора делается в самом событии компонента с вызовом doBreak doStop для прекращения повтора.
Если твоя задача, условно, "электронные часы", когда просто нужно с каким-то интервалом повторять некоторое действие - используй компонент Timer. Если нужно остановить таймер - опять же, определись при каком условии он должен остановиться.

Итак, у тебя, вероянто, наличествует логика "если произошло то и то (например, случилась ошибка) - надо повторить операцию". Что ты и решил кольцеванием. Это, как я понимаю, ближе к мышлению в бытовой жизни.
Ты должен переделать мышление: "повторять нужное мне действие до тех пор, пока не произойдёт то и это". И использовать для этого компонент Repeat с условием "1=1", проверять условие после каждого повтора (или перед) и вызвать doBreak doStop, когда произойдёт то что нужно.
Попробую подытожить:
1) Неправильная логика: выполнить действие -> проверить условие -> повторить действие
2) Правильная логика: циклично выполнять действие -> проверить условие -> прекратить повтор
карма: 26

0
Редактировалось 16 раз(а), последний 2020-01-15 11:47:42