Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#46: 2011-08-14 22:09:47 ЛС | профиль | цитата
1nd1g0, правильно ли я понял, что ставится несколько SafeMode с одним именем и каждый будет ждать пока выполнится тот, который запустился раньше него? Смутно поимаю куда эти SafeMode лепить.
------------ Д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


------------ Дoбавленo в 22.09:
А вот этот блочек-шпион ставим поле того, как поток завершен, и данные переданы другому потоку, который так же нужно сначала завершить.

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


карма: 0

0
Ответов: 3889
Рейтинг: 362
#47: 2011-08-14 22:32:10 ЛС | профиль | цитата
Neo, поняли, в принципе, правильно, делается примерно так (кнопкой можно "накидать" на стек значений, поток сам снимает их каждую секунду):

code_24905.txt

Обратите внимание, что для надёжности записи данных блокировка ветки doPush происходит с WaitMode = Wait. Это может "подвесить" поток, ожидающий прав на запись, зато запись гарантированно произойдёт после освобождения ресурса. Вариант с нижней точкой Вы тоже поняли, в принципе, правильно.
карма: 1

0
файлы: 1code_24905.txt [1.2KB] [90]
Ответов: 704
Рейтинг: 7
#48: 2011-08-14 22:41:05 ЛС | профиль | цитата
1nd1g0, а что идет после кнопки? Не показывается элемент.
------------ Дoбавленo в 22.41:
И еще вопрос: сейф мод можно ставить в любой связи или только после сапуска thread?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#49: 2011-08-14 22:44:45 ЛС | профиль | цитата
Neo, у Вас сильно устаревший конструктор, новый можно взять из моей подписи.
карма: 1

0
Ответов: 704
Рейтинг: 7
#50: 2011-08-14 22:58:18 ЛС | профиль | цитата
1nd1g0, спасибо, на ноуте обновил, а на сервере забыл
------------ Дoбавленo в 22.56:
Не понял зачем это если в стеке можно поставить игнор на попытку взять из пустого?
------------ Дoбавленo в 22.58:
Или это чтоб не получилось что стек одновременно записывает и пытается извлечь данные?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#51: 2011-08-14 23:03:26 ЛС | профиль | цитата
Neo писал(а):
чтоб не получилось что стек одновременно записывает и пытается извлечь данные?

Именно для этого.
карма: 1

0
Ответов: 704
Рейтинг: 7
#52: 2011-08-14 23:06:18 ЛС | профиль | цитата
Флудану свое большое спасибо, поскольку плюсы исчерпал.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#53: 2011-08-15 00:01:23 ЛС | профиль | цитата
Neo писал(а):
сейф мод можно ставить в любой связи или только после сапуска thread?

Перед любым участком любого имеющего конец кода, который по-Вашему не следует исполнять, пока не завершился любой другой участок кода, запущенный через SafeMode c такими же Mode и Name. Если код, например, поток, зациклится, то секция так и не освободится.

Есть ещё у нас MutexThread, по сути похожий на Thread + SafeMode в Mode = Global. Но критические секции (Mode = Local) работают быстрее.

Последнее напутствие: старайтесь не работать напрямую с элементами интерфейсаокнами из порождённых Вами потоков, весь интерфейс оставьте основным потокам форм приложения. Чем меньше "контактов со внешним миром" у Вашего потока, тем меньше он вызовет проблем. Особенно много хлопот доставляет отлов "плавающих" глюков, вызванных конкуренцией за одни данные, как Вы уже успели заметить на собственном примере.
карма: 1

1
Голосовали:Neo
53
Сообщение
...
Прикрепленные файлы
(файлы не залиты)