Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


Цитата Megatron13:
Обработка 1ого урл в этой программе для современных машин дело плевое, поэтому я захотел блекджека и шлюх, то есть обрабатывать несколько урлов одновременно, хотя это и необязательно, но желательно. »
Вам нужны два скрипта.
ThreadBalancer.cmd - тут указывается количество параллельно запущенных потоков, входной файл с url делится поровну между ними
Threads - потоки, Data - файл с URL-ками
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

:: Настройки
Set Data=data.txt
Set Threads=3

:: Подсчет общего числа строк
Set sCount=0&For /F "usebackq" %%A In ("%Data%") Do Set /A sCount+=1

:: Делим данные на части по количеству потоков
Set /A SingleThread=sCount/Threads
:: Удаляем предыдущие временные данные
Del "%Temp%\$thread*.txt" 2>nul
:: Проверяем, есть ли остаток
Set /A AllThreads=SingleThread*Threads
If %AllThreads%==%sCount% (
	rem Без остатка, просто разделяем данные на части по числу потоков
	Set cString=0&Set ThreadNum=1&Set /A Reset=SingleThread+1
	For /F "useback delims=" %%A In ("%Data%") Do (
		Set /A cString+=1
		If !cString!==!Reset! (Set /A ThreadNum+=1&Set cString=1)
		Echo %%A>>"%Temp%\$thread!ThreadNum!.txt"
	)
) Else (
	rem Есть остаток, добавляем излишки к последнему потоку
	Set cString=0&Set ThreadNum=1&Set /A Reset=SingleThread+1
	For /F "useback delims=" %%A In ("%Data%") Do (
		Set /A cString+=1
		If !cString!==!Reset! (
			If Not !ThreadNum! GEQ %Threads% (Set /A ThreadNum+=1)
			Set cString=1
		)
		Echo %%A>>"%Temp%\$thread!ThreadNum!.txt"
	)
)

:: Запускаем потоки, выполняющие последовательно каждый свою часть работы
:: Запуск производится в том же окне, чтобы не спамить окнами при большом
:: количество потоков
For /L %%N In (1,1,%Threads%) Do (
	Start /B Thread.cmd "%Temp%\$thread%%N.txt"
)
Pause>nul
Thread.cmd
А здесь уже собственно, запускается сама программа, которой поочередно скармливаются URL из диапазона, отданного потоку.
Код: Выделить весь код
@Echo Off
:: Последовательное выполнение из выделенной потоку очереди
For /F "usebackq delims=" %%A In ("%~1") Do (
	something.exe %%A
)
Exit
С вызовом программы сами уже определяйтесь, куда что и как перенаправлять.
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:17, 10-08-2012 | #5