Вверх ↑
Этот топик читают: Гость
Ответов: 824
Рейтинг: 138
#1: 2013-03-08 17:14:28 ЛС | профиль | цитата
Здравствуйте уважаемые Гуру HiAsm.
Нарисовал схему многопоточного копирования файлов на основе контейнеров
code_30531.txt
Теперь нужно определить какая схема отработала, (для вывода сообщения об окончании копирования)
Вроде вывел точки состояния схемы, но чего то не получается вывести это сообщение по окончании процесса.
Как в данном случае определить завершение копирования файлов


карма: 1

0
файлы: 1code_30531.txt [8.1KB] [288]
Ответов: 1536
Рейтинг: 176
#2: 2013-03-08 18:12:57 ЛС | профиль | цитата
sashaoli, а, что обязательно создавать внутри контейнера дополнительные потоки? Попробуй без Thread в контейнере.
Add(MainForm,1654302,119,133)
{
Width=374
Height=147
BorderStyle=1
link(onCreate,4285292:doEvent1,[])
}
Add(Edit,11641370,357,98)
{
Left=115
Top=15
Width=240
ColorSp=-16777215
Text=""
ReadOnly=0
link(onChange,9241815:doValue,[])
}
Add(Button,15167945,224,98)
{
Left=10
Top=15
Width=85
Caption="Sours Folder"
link(onClick,5279826:doBrowse,[])
}
Add(Browse,5279826,266,98)
{
Title="Select Pack Folder"
NewStyle=0
NewDirButton=1
link(onBrowse,429033:doEvent1,[])
}
Add(FileSearch,16211729,257,365)
{
@Hint=#32:Перебор файлов в выбранной папке|
TimeType=1
link(onSearch,3855596:doEvent1,[])
link(onEndSearch,9795724:doFor,[(305,378)(305,447)])
link(Dir,744672:Var,[])
}
Add(MultiElementEx,859352,481,434)
{
@Hint=#35:Схема вызывается для каждого потока|
Mode=1
link(onEnd,13378340:doMessage,[(522,440)(522,482)])
link(StringArray,11850414:Text,[])
AddHint(87,-2,183,26,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,9781944,28,21)
{
WorkCount=#5:##add|8:##select|24:doStart=Запускает процес|
EventCount=#28:onEnd=Работа схемы завершена|
VarCount=#7:##count|7:##index|21:State=Состояние схемы|12:##eventIndex|
DataCount=#32:StringArray=Масив путей к файлам|0:|
Width=461
Height=172
HOffset=30
Point(##add)
Point(##select)
Point(##count)
Point(##index)
Point(##eventIndex)
link(##add,7889051:doData,[(46,27)(46,76)])
link(doStart,965417:doEnum,[(39,41)(39,118)])
link(State,5687178:State,[(78,172)(202,172)])
}
Add(StrList,2252093,105,49)
{
}
Add(Replace,13002273,245,112)
{
link(onReplace,1228726:doString,[])
link(Sub_str,3458208:Var,[])
}
Add(FileTools,1141567,427,105)
{
link(FileName,965417:Item,[(433,90)(469,90)(469,162)(125,162)])
link(NewFileName,1228726:FString,[(440,95)(464,95)(464,156)(293,156)])
}
Add(ArrayEnum,965417,119,112)
{
link(onItem,13002273:doReplace,[])
link(onEndEnum,14890370:doEvent1,[])
link(Array,2252093:Array,[])
}
Add(GlobalVar,3458208,252,63)
{
Name="sours_fold"
}
Add(FormatStr,1228726,287,112)
{
Mask="%2%1"
Point(FString)
link(onFString,10879940:doPart,[])
link(Str2,3715577:Var,[])
}
Add(GlobalVar,3715577,294,84)
{
Name="dest_fold"
}
Add(FilePartElm,10879940,329,112)
{
Mode=0
link(onPart,10818881:doDir,[])
}
Add(Dir,10818881,378,112)
{
link(onEnd,1141567:doCopy,[])
}
Add(Switch,5687178,196,119)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(State)
link(onSwitch,9781944:onEnd,[(236,125)(236,27)])
}
Add(Hub,14890370,161,119)
{
link(onEvent1,5687178:doSwitch,[])
}
Add(Icon,14137199,168,42)
{
@Hint=#5:#main|
Icon=[ZIP9E09000078DAED955D48536118C78F7D51375A81262424595877E5BA2A22905D098110DEC430F522B225288524D445DA96F6652E144389F4A68B4CD15448A79BF363DAD4694EA7CE2F4CA7885F686AD3F0DFFF3D2D08AA7984EEEA1DBFBD8773CEFB7BDEF33CEF798F24F9F1171C2CF13F54CADC27494192249D203C259D92BE9FFF0BCD8FEC25FBC90105F893DD0ABD3B4800B94AEE139D17FD1F10D7B4E4D816EE3DE430394AD4D1D1D1B89D96865BA9A9B89194042DB9A6D5222E210157E2E26434B1B1B8141383A0A0A0018E39BB85FB32292195C46C301860EBEC44ABCD0693C5024B7333CC4D4D78535A8A1A930925E5E5B0B6B7C3C8E3888888698E39EFC37F91D8EA79EFDBB2323CC9CE86F0F7F4F6C24CB7F05BDBDA50DFD0809ABA3A585A5A50515525F746B319112A954F7F686868B55AADC6E2D2125CC3C3786F34CA7EE7C0001A396FE16EB65AD1D2DA2A5FAB658CB28A0AD47B636F357F954A559DC4FC2E2D2F636C7C1CF59C93F08B58ED1D1DE8753A51C76773B0D7EBD2F1E0790EB437AFC3909B2BE76DABF9FFF0AFACAC60726A0A8DCCB3F00FD15F535B0B13E389DCF5F5F723E76916F22A2B919E9D81BCFC7CB4F0D994FAD7D6D630333B2BE741F83F4D4CC0CABC0C0C0E6264741483434378F63813F9AF8B59A374BC2828C007D658A5D0EFF178B0B0B8081BC708FFF4F43406E97672DE96C646D8BBBBF1E861163233EE427FEF0E5E1517A3D36E57ECDFD8D8C067E6A8ABAB4BF6CFCDCD61666646EEC7C6C6E4B8FDACB99DD745DEBA18EF634F8F62FFE6E6263CEBEB70381CB27F91CF32C57A2C2C2CC8BD700DB3262EE6697864046E9EEBEDEB53EC174DC4E8673E847F89EB75823510FDFCFC3C9C5C3F93939370BBDD72CC66AE9DE49414040606BAA939ADC42F9ACBE592FDABABAB725E442F107197B986C5F117D6AA96394A4E4E86BFBFFF4BEF5EA8D8AFD16850CCFAFD8EA2A22219BD5E8FF0F070031507BD7BA322BF58A7625DFE8CC8C53BAEFBC2C242848585D9392C8A9CF3EECD7EBE364EE14F611E1313137D121F1F8FC8C84827879C21BB947E4C424242AAB3B9A7F942A7D3212A2ACAC1DB4F929DDBFC5E897DFFB8020E79BF3FFFDB3FD86026EC37C9D76DE34702C8117241E26BF80BDF0012AFFCBF]
}
Add(DoData,7889051,56,70)
{
link(onEventData,2252093:doText,[])
link(Data,9781944:StringArray,[])
}
END_SDK
Add(Hub,3855596,313,365)
{
link(onEvent1,11850414:doAdd,[])
link(onEvent2,15446539:doNext,[])
}
Add(GlobalVar,744672,264,336)
{
Name="sours_fold"
}
Add(Button,9416412,159,365)
{
Left=235
Top=85
Width=120
Caption="Copy"
link(onClick,6514589:doStart,[])
}
Add(Edit,4085769,357,49)
{
Left=115
Top=45
Width=240
ColorSp=-16777215
Text=""
ReadOnly=0
link(onChange,9677502:doValue,[])
}
Add(Browse,7576246,266,49)
{
Title="Select Pack Folder"
NewStyle=0
NewDirButton=1
link(onBrowse,4085769:doText,[])
}
Add(GlobalVar,9677502,406,49)
{
Name="dest_fold"
Data=String()
}
Add(Button,1923096,224,49)
{
Left=10
Top=45
Width=85
Caption="Dest Folder"
link(onClick,7576246:doBrowse,[])
}
Add(For,9795724,376,441)
{
@Hint=#31:Цикл запуска процесса в потоках|
IncludeEnd=1
link(onEvent,15965135:doEvent1,[])
link(End,859352:##count,[(389,428)(418,428)(418,478)(487,478)])
AddHint(-241,19,188,13,@Hint)
}
Add(Label,8815368,412,231)
{
Left=175
Top=90
}
Add(Hub,4285292,168,147)
{
link(onEvent1,16583815:doWork2,[])
link(onEvent2,6202415:doPosition,[(201,160)(201,230)])
}
Add(GlobalVar,9241815,406,98)
{
Name="sours_fold"
Data=String()
}
Add(CounterEx,15446539,362,372)
{
@Hint=#48:Счетчик максимального количества файлов в потоке|
Min=1
Max=500
Point(onThroughMax)
Point(doReset)
Point(doMax)
Point(Max)
link(onThroughMax,14749321:doEvent1,[])
AddHint(0,-56,200,26,@Hint)
}
Add(Hub,14749321,404,379)
{
OutCount=3
link(onEvent1,859352:##add,[(450,385)(450,440)])
link(onEvent2,11850414:doClear,[(432,392)(432,378)])
link(onEvent3,15446539:doReset,[(428,399)(428,412)(350,412)(350,385)])
}
Add(StrList,11850414,481,365)
{
@Hint=#31:Список файлов для одного потока|19:Для каждого - новый|
AddHint(67,-1,190,26,@Hint)
}
Add(UpDown,6202415,237,224)
{
Left=150
Top=85
Max=6
Min=1
Position=2
link(onPosition,12850526:doText,[])
}
Add(FileSearch,12643089,350,147)
{
@Hint=#35:Количество файлов в выбранной папке|
TimeType=1
link(Dir,11641370:Text,[])
AddHint(67,1,186,26,@Hint)
}
Add(Edit,12850526,286,224)
{
Left=115
Top=85
Width=35
link(onChange,14076929:doWork2,[])
link(Str,6038432:Var2,[])
}
Add(MathParse,6828647,343,224)
{
MathStr="trunc(%2/%1)+1"
ResultType=0
link(onResult,8996694:doEvent1,[])
link(X1,6038432:Var3,[(349,208)])
link(X2,12643089:Count,[])
}
Add(GetDataEx,6038432,286,203)
{
Angle=3
link(Data,6202415:Position,[(216,208)(216,264)(243,264)])
}
Add(Hub,429033,308,98)
{
OutCount=3
link(onEvent1,11641370:doText,[])
link(onEvent2,16583815:doWork1,[(340,111)])
link(onEvent3,14076929:doWork1,[(332,118)])
}
Add(HubEx,16583815,336,147)
{
link(onEvent,12643089:doSearch,[])
}
Add(HubEx,14076929,328,224)
{
link(onEvent,6828647:doCalc,[])
}
Add(Hub,8996694,384,224)
{
link(onEvent1,14983954:In,[])
link(onEvent2,8815368:doText,[])
}
Add(Thread,6514589,208,365)
{
FastStop=0
link(onExec,16211729:doSearch,[])
}
Add(Label,7620334,153,224)
{
Left=15
Top=90
Width=90
Height=17
Caption="Number of threads"
}
Add(LineBreak,11283616,313,386)
{
@Color=65535
link(Out,15446539:doMax,[])
Primary=[14983954,141,-162]
}
Add(Hub,15965135,427,441)
{
link(onEvent1,859352:##select,[])
link(onEvent2,859352:doStart,[])
}
Add(InfoTip,2424062,147,196)
{
Info=#33:Расчет количества файлов на поток|
VAlign=2
Width=351
Height=88
}
Add(StyleXP,5108433,119,84)
{
}
Add(Message,13378340,546,476)
{
link(Message,859352:##eventIndex,[(552,467)(538,467)(538,474)(508,474)])
}
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 824
Рейтинг: 138
#3: 2013-03-08 18:16:49 ЛС | профиль | цитата
Не знаю..., так для надежности, смотрел здесь на примеры.
Вот и решил - Thread наверное будет не лишним...
И разве контейнер создает оделенный поток?
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#4: 2013-03-08 19:05:09 ЛС | профиль | цитата
sashaoli писал(а):
Нарисовал схему многопоточного копирования файлов
А зачем это нужно ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:foksov
Ответов: 824
Рейтинг: 138
#5: 2013-03-08 19:24:41 ЛС | профиль | цитата
ser_davkin писал(а):
а, что обязательно создавать внутри контейнера дополнительные потоки? Попробуй без Thread в контейнере.

Проверил подправленную схему.
Все таки нужно использовать Thread, потому как Ваш пример работает с ошибками - не копируются все файлы.
И потом - в Вашем случае копии контейнера выполняются последовательно, то есть пока одна копия не завершит работу следующая не запускается.
------------ Дoбавленo в 19.24:
Tad писал(а):
А зачем это нужно ?

Для ускорения процесса копирования множества файлов.
Например: игра Skyrim - больше 11000 файлов и больше 5 Гб, обычным методом копируется от 5 до 8 мин. (у меня)
Хотя комп у меня не слабый. А с помощью приведенной мной схемы около 2 мин.
В общем - это не только метод копирования файлов, а вообще ускорение обработки большого количества файлов.
Ведь в контейнер можно засунуть и другие операции по работе с файлами.

Да, и чтобы засечь время (программно) нужно определить момент завершения работы всех копий схемы.
карма: 1

0
Ответов: 274
Рейтинг: 47
#6: 2013-03-08 19:37:09 ЛС | профиль | цитата
Жесткий диск потоками не ускоришь
карма: 0

0
Ответов: 824
Рейтинг: 138
#7: 2013-03-08 19:47:14 ЛС | профиль | цитата
Laetar писал(а):
Жесткий диск потоками не ускоришь

А при чем здесь ускорение жесткого диска?
Вы можете у себя на компе запустить браузер, несколько качалок, редактировать какой то документ сохранять/читать его. И это происходит одновременно. Ведь нету у Вас ситуации когда при закачке файла из инета (то есть записи на диск) - Вы не можете сохранить документ ворд или скопировать файл в другую папку? Это, наверное, потому что все эти операции выполняются в своих потоках, пусть даже в псевдопотоках.

карма: 1

0
Ответов: 274
Рейтинг: 47
#8: 2013-03-08 19:59:31 ЛС | профиль | цитата
sashaoli, У жестких дисков есть параметр скорости чтения/записи (Мб/сек)
карма: 0

0
Ответов: 824
Рейтинг: 138
#9: 2013-03-08 20:04:20 ЛС | профиль | цитата
Я так понимаю ни у кого нет нет вразумительного совета.... А жаль...
карма: 1

0
Ответов: 1376
Рейтинг: 197
#10: 2013-03-08 20:06:37 ЛС | профиль | цитата
Многопоточное массовое копирование файлов
sashaoli писал(а):
Для ускорения процесса копирования множества файлов

скорее для ускорения процесса износа диска
sashaoli писал(а):
Вы можете у себя на компе запустить браузер, несколько качалок, редактировать какой то документ сохранять/читать его
совершенно разные действия, выполняющиеся, как и всё остальное на компе, последовательно...
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#11: 2013-03-08 20:07:16 ЛС | профиль | цитата
Laetar писал(а):
Жесткий диск потоками не ускоришь
К этому можно ещё добавить "Ничего в компьютере не делается одновременно.
Я потому и спросил:
Tad писал(а):
А зачем это нужно ?

Если грубо и на пальцах, то:
1. Ты запустил свою прогу.
2. ОС выделяет ей отдельный поток и время активности этого потока. Условно возьмём 6 сек. (На самом деле это время измеряется в мкс или,в лучшем случае, в мс)
3. Ты организовуешь 6 потоков. ОС тебе время не добавит, а просто разделит, выделенные 6 сек на 6 твоих потоков, т.е. на каждый по 1 сек.

По времени копирования выиграша не будет, а вот хард будет двигать головками как сумасшедший.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 824
Рейтинг: 138
#12: 2013-03-08 20:24:43 ЛС | профиль | цитата
Я привел пример.
В общем - это не только метод копирования файлов, а вообще ускорение обработки большого количества файлов.
Я понимаю, что винт больше не выдаст чем может и тем более старый винт.
Возможно я задал не правильное название темы. Копирование, это пример. Почему копирование? - то что легче всего было организовать.(для меня)
Скажем так - Многопоточная обработка файлов(данных). Например: парсинг, замена текста, .... здесь может бить не только работа с файлами - можно со строками, сжатие, ну напридумывать можно много.
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#13: 2013-03-08 20:32:01 ЛС | профиль | цитата
sashaoli писал(а):
а вообще ускорение обработки большого количества файлов.
Заблуждение. Ускорения не будет никогда. Замедление - ДА.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 824
Рейтинг: 138
#14: 2013-03-08 20:38:10 ЛС | профиль | цитата
Ну хорошо - ошибаюсь, убедили.
Но все таки, как определить завершение обработки данных всех копий контейнера?
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#15: 2013-03-08 20:49:29 ЛС | профиль | цитата
sashaoli писал(а):
как определить завершение обработки данных всех копий контейнера
Точка ArrayEnum.onEndEnum

Да, у тебя в схеме нарушен порядок событий
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)