Вверх ↑
Ответов: 1925
Рейтинг: 172
#1: 2017-12-13 11:09:55 ЛС | профиль | цитата
Хочу сделать многопоточную загрузку файлов. Алгоритм такой:
1. Первый поток двигает счётчик, извлекает ссылку и начинает загрузку.
2. Второй поток параллельно делает то же самое.

Но вот вопрос: не будет ли ошибок и конфликтов, если два потока долбятся в одну схему? У меня в схеме счётчик и получение ссылки и имени локального файла - общие для обоих потоков, так вот как защитить этот участок, чтобы второй поток не ломанулся туда, пока первый не отработал?

Я составил вот так:

Add(MainForm,2953706,84,84)
{
Position=1
}
Add(Thread,16117486,231,168)
{
Delay=0
FastStop=0
link(onExec,8479595:doEvent1,[])
}
Add(Math,9808350,651,168)
{
@Hint=#35:Счётчик для перебора строк в списке|
Op2=1
ResultType=0
Default=-1
Point(doClear)
link(Op1,1795754:Var1,[(657,156)(648,156)(648,215)])
}
Add(If_else,450274,651,266)
{
Type=3
link(onTrue,13588247:doRead,[])
link(Op1,1795754:Var2,[])
link(Op2,16699030:EndIdx,[])
}
Add(GetDataEx,1795754,651,210)
{
link(Data,9808350:Result,[])
}
Add(ArrayRW,13588247,714,266)
{
link(onRead,6155442:Method,[(762,272)(762,275)])
link(Array,16699030:Array,[])
link(Index,1795754:Var3,[(727,215)])
}
Add(HTTP_Get,15481560,714,462)
{
Wait=0
link(onStop,14082066:doEvent1,[])
link(URL,7003931:Value,[])
link(FileName,494180:Value,[])
}
Add(Hub,14082066,763,483)
{
OutCount=3
link(onEvent3,757926:doDeferredEvent,[])
}
Add(LineBreak,5489820,280,175)
{
Caption="re"
link(Out,8479595:doEvent2,[])
Primary=[10910484,560,322]
}
Add(DeferredEvent,757926,798,497)
{
link(onDeferredEvent,10910484:In,[])
}
Add(Hub,12653916,567,168)
{
InCount=3
link(onEvent1,9808350:doOperation,[])
link(onEvent2,450274:doCompare,[(593,181)(593,272)])
}
Add(Memory,494180,721,420)
{
Point(Data)
link(Data,13273961:Var2,[])
}
Add(Memory,7003931,714,350)
{
Point(Data)
link(onData,494180:doValue,[(758,356)(758,391)(709,391)(709,426)])
link(Data,1580071:Var2,[])
}
Add(Hub,15593223,441,168)
{
link(onEvent1,12653916:doEvent1,[])
link(onEvent2,13787866:In,[])
}
Add(LineBreak,13879588,672,350)
{
link(Out,7003931:doValue,[])
Primary=[13787866,-203,-175]
}
Add(Hub,8479595,322,168)
{
InCount=2
OutCount=3
link(onEvent1,13202732:doSafeMode,[])
link(onEvent3,14132148:In,[(343,188)(343,195)])
}
Add(SafeMode,13202732,392,168)
{
link(onSafeMode,15593223:doEvent1,[])
}
Add(Thread,935624,231,259)
{
Delay=0
FastStop=0
link(onExec,10619640:doEvent1,[])
}
Add(Hub,10619640,322,259)
{
InCount=2
OutCount=3
link(onEvent1,9555098:doSafeMode,[])
link(onEvent3,10942780:In,[(343,279)(343,286)])
}
Add(SafeMode,9555098,392,259)
{
link(onSafeMode,3015750:doEvent1,[])
}
Add(Hub,3015750,441,259)
{
link(onEvent1,12653916:doEvent2,[(511,265)(511,181)])
link(onEvent2,13515872:In,[])
}
Add(LineBreak,15146009,665,462)
{
Caption="dwn"
link(Out,15481560:doDownload,[])
Primary=[14132148,-315,-273]
}
Add(HTTP_Get,277648,546,686)
{
Wait=0
link(onStop,7011035:doEvent1,[])
link(URL,946856:Value,[])
link(FileName,16729224:Value,[])
}
Add(Hub,7011035,595,707)
{
OutCount=3
link(onEvent3,13485263:doDeferredEvent,[])
}
Add(LineBreak,548609,280,266)
{
Caption="re"
link(Out,10619640:doEvent2,[])
Primary=[8674877,392,455]
}
Add(DeferredEvent,13485263,630,721)
{
link(onDeferredEvent,8674877:In,[])
}
Add(Memory,16729224,553,644)
{
Point(Data)
link(Data,13273961:Var1,[(559,404)])
}
Add(Memory,946856,546,574)
{
Point(Data)
link(onData,16729224:doValue,[(590,580)(590,615)(541,615)(541,650)])
link(Data,1580071:Var1,[(552,327)])
}
Add(LineBreak,11839327,504,574)
{
link(Out,946856:doValue,[])
Primary=[13515872,-35,-308]
}
Add(LineBreak,9040062,497,686)
{
Caption="dwn"
link(Out,277648:doDownload,[])
Primary=[10942780,-147,-406]
}
Add(GetDataEx,1580071,714,322)
{
link(Data,13588247:Item,[])
}
Add(ListBox,16699030,700,147)
{
Left=110
Top=10
Width=150
Height=235
Strings=#1:1|1:2|1:3|1:4|1:5|
Point(EndIdx)
}
Add(Button,5052351,91,168)
{
Left=30
Top=20
link(onClick,9075221:doEvent1,[])
}
Add(Hub,9075221,147,168)
{
link(onEvent1,16117486:doStart,[])
link(onEvent2,935624:doStart,[(196,181)(196,265)])
}
Add(PointHint,6155442,777,259)
{
Info=#28:Тут формирование имени файла|
Width=190
}
Add(GetDataEx,13273961,721,399)
{
Angle=1
link(Data,6155442:Var,[(872,404)])
}

1. Можно ли вообще использовать так компонент SafeMode?
2. Видел компоненты Mutex и MutexThread, но как их вообще использовать? Можно пример?
3. Имеет ли смысл после закачки использовать DeferredEvent, как у меня в схеме?
карма: 9
0