Вверх ↑
Этот топик читают: Гость
Ответов: 1343
Рейтинг: 31
#1: 2021-08-29 16:32:32 ЛС | профиль | цитата
в первом примере твориться ад, во втором примере все в очередь и всё работает.
вопрос в том, как организовать сохранение данных в один массив из множества потоков, максимально грамотно.


Add(MainForm,2953706,28,63)
{
}
Add(Hub,671545,231,77)
{
OutCount=6
link(onEvent1,12880119:doStart,[])
link(onEvent2,2401680:doStart,[(259,90)(259,125)])
link(onEvent3,11287895:doStart,[(259,97)(259,167)])
link(onEvent4,7104336:doStart,[(259,104)(259,209)])
link(onEvent5,1007388:doStart,[(259,111)(259,251)])
link(onEvent6,5463260:doStart,[(259,118)(259,293)])
}
Add(Thread,12880119,273,77)
{
Delay=0
link(onExec,7770141:doRandom,[])
}
Add(Thread,2401680,273,119)
{
Delay=0
link(onExec,3017766:doRandom,[])
}
Add(StrList,134992,490,77)
{
AddType=1
}
Add(Hub,13082622,441,77)
{
InCount=6
OutCount=1
link(onEvent1,134992:doAdd,[])
}
Add(Random,7770141,322,77)
{
Min=11
Max=99
link(onRandom,13082622:doEvent1,[])
}
Add(Random,3017766,322,119)
{
Min=11
Max=99
link(onRandom,13082622:doEvent2,[(398,125)(398,90)])
}
Add(Hub,8921805,231,448)
{
OutCount=6
link(onEvent1,11402265:doStart,[])
link(onEvent2,8051559:doStart,[(259,461)(259,496)])
link(onEvent3,6494837:doStart,[(259,468)(259,538)])
link(onEvent4,13230350:doStart,[(259,475)(259,580)])
link(onEvent5,11213531:doStart,[(259,482)(259,622)])
link(onEvent6,7012723:doStart,[(259,489)(259,671)])
}
Add(Thread,11402265,273,448)
{
Delay=0
link(onExec,11286483:doRandom,[])
}
Add(Thread,8051559,273,490)
{
Delay=0
link(onExec,13617898:doRandom,[])
}
Add(StrList,5680144,714,777)
{
AddType=1
}
Add(Hub,15569940,679,777)
{
InCount=6
OutCount=1
link(onEvent1,5680144:doAdd,[])
}
Add(Random,11286483,322,448)
{
Min=11
Max=99
link(onRandom,4058018:doAdd,[])
}
Add(Random,13617898,322,490)
{
Min=11
Max=99
link(onRandom,9005774:doAdd,[])
}
Add(Thread,5747200,336,777)
{
Delay=0
FastStop=0
link(onExec,2019774:doEnum,[])
}
Add(StrList,4058018,371,448)
{
AddType=1
}
Add(StrList,9005774,406,490)
{
AddType=1
}
Add(ArrayEnum,2019774,385,777)
{
link(onItem,15569940:doEvent1,[])
link(onEndEnum,10649937:doEnum,[])
link(Array,4058018:Array,[])
}
Add(Timer,4547392,175,140)
{
Interval=5000
Enable=1
AutoStop=1
link(onTimer,9790411:doEvent1,[])
}
Add(Timer,8087895,168,497)
{
Interval=5000
Enable=1
AutoStop=1
link(onTimer,4953826:doEvent1,[])
}
Add(Hub,4953826,231,497)
{
OutCount=7
link(onEvent1,11402265:doStop,[(259,503)(259,461)])
link(onEvent2,8051559:doStop,[(259,510)(259,503)])
link(onEvent3,6494837:doStop,[(259,517)(259,545)])
link(onEvent4,13230350:doStop,[(259,524)(259,587)])
link(onEvent5,11213531:doStop,[(259,531)(259,629)])
link(onEvent6,7012723:doStop,[(259,538)(259,678)])
link(onEvent7,5747200:doStart,[(291,545)(291,783)])
}
Add(Hub,9790411,231,140)
{
OutCount=6
link(onEvent1,12880119:doStop,[(259,146)(259,90)])
link(onEvent2,2401680:doStop,[(259,153)(259,132)])
link(onEvent3,11287895:doStop,[(259,160)(259,174)])
link(onEvent4,7104336:doStop,[(259,167)(259,216)])
link(onEvent5,1007388:doStop,[(259,174)(259,258)])
link(onEvent6,5463260:doStop,[(259,181)(259,300)])
}
Add(ArrayEnum,10649937,427,784)
{
link(onItem,15569940:doEvent2,[])
link(onEndEnum,8600428:doEnum,[])
link(Array,9005774:Array,[(433,660)(426,660)])
}
Add(Hub,6895610,112,140)
{
link(onEvent1,4547392:doTimer,[])
link(onEvent2,671545:doEvent1,[(156,153)(156,83)])
}
Add(Hub,2093782,105,476)
{
link(onEvent1,8087895:doTimer,[(143,482)(143,503)])
link(onEvent2,8921805:doEvent1,[(150,489)(150,454)])
}
Add(Thread,11287895,273,161)
{
Delay=0
link(onExec,8557601:doRandom,[])
}
Add(Thread,7104336,273,203)
{
Delay=0
link(onExec,2231037:doRandom,[])
}
Add(Random,8557601,322,161)
{
Min=11
Max=99
link(onRandom,13082622:doEvent3,[(398,167)(398,97)])
}
Add(Random,2231037,322,203)
{
Min=11
Max=99
link(onRandom,13082622:doEvent4,[(398,209)(398,104)])
}
Add(Thread,1007388,273,245)
{
Delay=0
link(onExec,14982991:doRandom,[])
}
Add(Thread,5463260,273,287)
{
Delay=0
link(onExec,10371090:doRandom,[])
}
Add(Random,14982991,322,245)
{
Min=11
Max=99
link(onRandom,13082622:doEvent5,[(398,251)(398,111)])
}
Add(Random,10371090,322,287)
{
Min=11
Max=99
link(onRandom,13082622:doEvent6,[(398,293)(398,118)])
}
Add(Thread,6494837,273,532)
{
Delay=0
link(onExec,12009289:doRandom,[])
}
Add(Random,12009289,322,532)
{
Min=11
Max=99
link(onRandom,14478302:doAdd,[])
}
Add(StrList,14478302,441,532)
{
AddType=1
}
Add(Thread,13230350,273,574)
{
Delay=0
link(onExec,16296526:doRandom,[])
}
Add(Random,16296526,322,574)
{
Min=11
Max=99
link(onRandom,15721778:doAdd,[])
}
Add(StrList,15721778,476,574)
{
AddType=1
}
Add(Thread,11213531,273,616)
{
Delay=0
link(onExec,5063467:doRandom,[])
}
Add(Random,5063467,322,616)
{
Min=11
Max=99
link(onRandom,15509713:doAdd,[])
}
Add(StrList,15509713,511,616)
{
AddType=1
}
Add(Thread,7012723,273,665)
{
Delay=0
link(onExec,9247376:doRandom,[])
}
Add(Random,9247376,322,665)
{
Min=11
Max=99
link(onRandom,10304999:doAdd,[])
}
Add(StrList,10304999,539,665)
{
AddType=1
}
Add(ArrayEnum,8600428,469,791)
{
link(onItem,15569940:doEvent3,[])
link(onEndEnum,2686760:doEnum,[])
link(Array,14478302:Array,[(475,684)(461,684)])
}
Add(ArrayEnum,2686760,511,798)
{
link(onItem,15569940:doEvent4,[])
link(onEndEnum,10449547:doEnum,[])
link(Array,15721778:Array,[(517,708)(496,708)])
}
Add(ArrayEnum,10449547,553,805)
{
link(onItem,15569940:doEvent5,[])
link(onEndEnum,9217789:doEnum,[])
link(Array,15509713:Array,[(559,733)(531,733)])
}
Add(ArrayEnum,9217789,595,812)
{
link(onItem,15569940:doEvent6,[])
link(Array,10304999:Array,[(601,761)(559,761)])
}


Редактировалось 1 раз(а), последний 2021-08-29 16:32:41
карма: 2

0
Ответов: 4628
Рейтинг: 749
#2: 2021-08-30 11:40:33 ЛС | профиль | цитата
1) В компоненте StrList не предусмотрено одновременное изменение данных несколькими потоками. В любом случае для этого потоки должны становиться в очередь. Так всегда бывает, когда идет работа с общими данными. В схеме реализуется компонентом SafeMode[Local] на входе StrList (проверить), либо на каждом выходе потока (если предыдущий вариант не работоспособный).
2) Метод Thread.doStop применять нельзя ни в каких случаях. Это приводит к утечке памяти и системных ресурсов.
карма: 26

0
Ответов: 1343
Рейтинг: 31
#3: 2021-09-01 14:12:52 ЛС | профиль | цитата
Netspirit писал(а):
SafeMode[Local] на входе StrList



отлично работает, спасибо
карма: 2

0
3
Сообщение
...
Прикрепленные файлы
(файлы не залиты)