------------ Дoбавленo в 21.09:
Отдельное спасибо за применение режима телепата ))
------------ Дoбавленo в 21.13:
Разве проблема уникальна и никто не сталкивался с тормозами при работе с очередями? Неужели такое, на первый взгляд протое, так сложно реализовать из-за потоков? У меня уже достаточно мест в схемах, где приходится обходится с очередью, но без потока, но сейчас это все стало хором тормозить и без потоков уже никак.
------------ Дoбавленo в 21.35:
------------ Дoбавленo в 22.00:
Вроде вымучал и оформил для последователей, столкнувшихся с подобным.
Суть в том, что блочек работает как с ожиданием завершения текущего потока, так и с ожиданием завершения последующей обработки данных. Использую чтоб очередь событий не вызывала накладок при обработке. Нагрузка на процессор при этом остается практичесски стабильной.
Add(MultiElement,14348727,266,168)
{
@Hint=#62:Стек с очередной выдачей данных для последовательной обработки|
@Color=0
AddHint(-26,64,193,26,@Hint)
}
BEGIN_SDK
Add(EditMulti,15066390,21,21)
{
EventCount=1
WorkCount=1
DataCount=1
Width=496
Height=235
link(doWork1,961680:doPush,[(59,27)(59,55)])
}
Add(StackEx,961680,140,49)
{
StackType=0
Point(Count)
Point(onEmpty)
link(onPop,9542663:doEvent1,[])
}
Add(MMTimer,16297399,140,161)
{
Interval=5
link(onTimer,3455122:doCompare,[])
}
Add(If_else,3455122,196,161)
{
@Hint=#62:Проверяет завершен ли поток, ведущий данные к обработке в базе|
Op2=Integer(0)
link(onTrue,3732659:doCompare,[])
link(Op1,2883:Busy,[(202,128)(335,128)])
AddHint(-58,50,186,26,@Hint)
}
Add(Thread,2883,329,63)
{
@Hint=#20:Запуск нового потока|
Delay=0
FastStop=0
link(onExec,5641744:doData,[])
}
Add(DoData,5641744,385,63)
{
link(onEventData,15066390:onEvent1,[(429,69)(429,27)])
link(Data,14970407:Value,[(391,51)(331,51)(331,135)(272,135)])
}
Add(Hub,9542663,210,56)
{
link(onEvent1,14970407:doValue,[(245,62)(245,97)])
link(onEvent2,2883:doStart,[])
}
Add(Memory,14970407,266,91)
{
}
Add(If_else,3732659,245,161)
{
@Hint=#61:Проверяет завершен ли поток с данными после обработаки в базе|
Op2=Integer(0)
link(onTrue,961680:doPop,[(289,167)(289,115)(128,115)(128,62)])
link(Op1,15066390:Data1,[(251,91)(27,91)])
AddHint(64,-8,182,26,@Hint)
}
END_SDK
А вот этот блочек-шпион ставим поле того, как поток завершен, и данные переданы другому потоку, который так же нужно сначала завершить.
Add(MultiElement,16496038,1232,819)
{
}
BEGIN_SDK
Add(EditMulti,8310702,21,21)
{
EventCount=1
WorkCount=1
VarCount=1
link(doWork1,9542663:doEvent1,[(39,27)(39,90)])
link(Var1,2883:Busy,[(27,172)(181,172)])
}
Add(Thread,2883,175,91)
{
@Hint=#20:Запуск нового потока|
Delay=0
FastStop=0
link(onExec,5641744:doData,[])
}
Add(DoData,5641744,231,91)
{
link(onEventData,8310702:onEvent1,[(292,97)(292,27)])
link(Data,14970407:Value,[(237,79)(177,79)(177,163)(118,163)])
}
Add(Hub,9542663,56,84)
{
link(onEvent1,14970407:doValue,[(91,90)(91,125)])
link(onEvent2,2883:doStart,[])
}
Add(Memory,14970407,112,119)
{
}
END_SDK