Ну как бы это ужасный многопоток. Но для одного действия подойдет. А если действий много? То данные будут теряться.
И лутче переменую счёта обьявить в потоке тоесть в процедуре
Код:
int index_thread = main;
main++;
А так у тебя будет много потоков которые делают одно и тоже....
а надо просто сделать
Yukikaze, Только что прочитал ваш код, что раньше сделать поленился..
Жесть.
1. К чему тут ртф я так и не понял
2. Зачем это писать еще и в файл?!
3. Элементарнеший вариант: code
Пример собсно параллелит отправку пустых запросов, "подтверждает" работоспособность логами и ответами сервов.
2 текстбокса - tAddress(адреса), Received(для полученых данных. выводит айди потока кол-во уже выполненных запросов в этом потоке, пришедшие данные), LOG(сюда выводим инфо о расчетах)
1 батон - bSend
+ таймер - Timer(тут обновляем инфо в текстбоксе "Ресайвед". Прост если через (Бегин)Инуок обновлять ложится форма - слишком много "добра")
Кол-во потоков в переменной ThreadsCounter
Код:
string RECEIVED = "";
int ThreadsCounter=5; //предположим тут кол-во потоков.
void bSendClickedHandler(object s, EventArgs args)
{
Queue<string> Addresses = new Queue<string>(tAddresses.Text.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries));
int AddressesCount = Addresses.Count;
int AddressesPerThread = AddressesCount / ThreadsCounter;
while (AddressesPerThread * ThreadsCounter < AddressesCount)
{
++AddressesPerThread;
}
int Line = 0;
LOG.Text += "Addresses Count: " + AddressesCount.ToString();
LOG.Text += "\r\n";
LOG.Text += "Addresses per thread: " + AddressesPerThread.ToString();
LOG.Text += "\r\n";
for (int i = 0; i < ThreadsCounter; ++i)
{
Stack<string> AddressesPerCurrentThread = new Stack<string>();
int lines = AddressesCount - Line;
if (lines > AddressesPerThread && i < ThreadsCounter-1)
lines = AddressesPerThread;
for (int j = 0; j < lines; ++j)
{
AddressesPerCurrentThread.Push(Addresses.Dequeue());
++Line;
}
LOG.Text += "New thread handles " + lines.ToString() + " addresses\r\n";
Send(AddressesPerCurrentThread);
}
}
void Send(Stack<string> addrs)
{
Thread th = new Thread(delegate()
{
int counter=-1;
loop:
try
{
HttpWebRequest req = HttpWebRequest.Create(addrs.Pop()) as HttpWebRequest;
HttpWebResponse res = req.GetResponse() as HttpWebResponse;
string rec = new StreamReader(res.GetResponseStream()).ReadToEnd();
RECEIVED += "\r\nThread: " + Thread.CurrentThread.ManagedThreadId.ToString() + "\r\nAddr: " + (++counter).ToString() + "\r\nData: " + rec+ "\r\n-----------------\r\n";
res.Close();
}
catch
{
}
if (addrs.Count > 0)
goto loop;
});
th.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
this.Received.Text = RECEIVED;
}
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Минус - порой расчитывает так, что часть потоков обрабатывает по несколько адресов, остальная часть - ничего (видно на скрине).
Ну да не страшно.
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось •theSaboteur•; 29.01.2012 в 17:23.
Причина: added link to source code