Вверх ↑
Ответов: 3889
Рейтинг: 362
#1: 2011-08-19 08:55:37 ЛС | профиль | цитата
Neo писал(а):
как-то мониторить, что поток с данными со стека завершился, если я переделываю так?

Обычно - не за зачем, SafeMode с noWait после onExec гарантированно прервёт исполнение кода после onSafeMode столько раз, сколько понадобится для отработки параллельного потока, запущенного с парного SafeMode.

Но если очень долго может отрабатывать поток, и параллельный поток очень активно кладёт на стек, тогда либо ставить Wait, либо порождать очередной поток, для надёжности можно его останавливать (только не из самого себя, а через Timer, например).
------------ Дoбавленo в 08.41:
Neo писал(а):
произойдет такая же накладка, от которой я бежал

С noWait вообще ничего не произойдёт, ветка после onSafeMode просто не будет выполняться, если же она начала исполняться, то отработает полностью. Но Вы обязаны помнить, что вся она принадлежит отдельному потоку, у Вас могут быть конфликты с параллельными потоками там, где не используетсяне возможно использовать SafeMode. Это уже забота программиста - отслеживать такие ньюансы.

Именно по-этому Вам тут рекомендуют использовать обычный Timer или точку onSyncExec (Thread) (точность хуже MMTimer, зато интервал срабатывания много меньше 16 мсек, характерных для Timer)- по сути, это псевдомногопоточное программирование, зато практически исключены конфликты за одни и те же данные, не надо ломать голову над "непонятными глюками" типа тех, с которыми Вы сталкиваетесь.
------------ Дoбавленo в 08.55:
Neo писал(а):
а сейчас новая проблема

За Вас всё "видит" SafeMode (WaitMode=NoWait):


Add(MultiElement,4063234,532,63)
{
@Hint=#29:Новый поток с теми же данными|
@Color=0
}
BEGIN_SDK
Add(EditMulti,15066390,21,21)
{
EventCount=1
WorkCount=1
Width=237
Height=193
link(doWork1,13267528:doSafeMode,[(45,27)(45,62)])
}
Add(MMTimer,16297399,77,147)
{
Interval=30
link(onTimer,10907756:doSafeMode,[])
}
Add(SafeMode,13267528,126,56)
{
Name="My_SafeMode3"
link(onSafeMode,14867656:doPush,[(180,62)(180,104)])
}
Add(SafeMode,10907756,126,147)
{
Name="My_SafeMode3"
WaitMode=1
link(onSafeMode,14867656:doPop,[(180,153)(180,111)])
}
Add(Stack,14867656,203,98)
{
link(onPop,15066390:onEvent1,[(239,111)(239,27)])
}
END_SDK

карма: 1

0