В свое время долго искал нормальный гайд по многопоточности, так и не нашел) Добивался своими силами Решил сделать свой теперь)
1. Создаем новый проект, кидаем на форму кнопку, numericUpDown, richTextBox
[Ссылки могут видеть только зарегистрированные пользователи. ]
Код:
public Form1()
{
InitializeComponent();
}
int main;
string[] mas;
2. Тыкаем по кнопке, копируем туда вот это
Код:
mas = richTextBox1.Text.Split('\n');
main = 0;
int s = Convert.ToInt32(numericUpDown1.Text);
Thread[] thread = new Thread[s];
for (int i = 0; i < s; i++)
{
Thread thr = new Thread(new ThreadStart(s_w));
thread[i] = thr;
Thread.Sleep(55);
thread[i].Start();
}
xFroLx, Очень благодарен. Почти каждый день искал что то подобное.
Попробовал, все в принципе хорошо, но нашел пару недочетов.
Если break не ставить, то он по моему метод выполняется дальше, система грузится очень сильно, хотя запросы уже все прошли и по идее программа должна бездействовать.
Код:
private void s_w()
{
while (true)
{
try
{
main++;
send_POST("http://www.yandex.ru/"+mas[main - 1], ""); ///Меняем на свое
}
catch { break; }
}
}
И вот еще, если строк в richTextBox меньше чем выбрано потоков, то вылетает ошибка. Я избавился так (может есть способ проще, хотя меня и этот устраивает)
Код:
mas = richTextBox1.Text.Split('\n');
main = 0;
int s = Convert.ToInt32(numericUpDown1.Text);
Thread[] thread = new Thread[s];
if (richTextBox1.Lines.Length <= s) { s = r1.Lines.Length; }
for (int i = 0; i < s; i++)
{
Thread thr = new Thread(new ThreadStart(s_w));
thread[i] = thr;
Thread.Sleep(55);
thread[i].Start();
}
Минус здесь в том, что больше 5 потоков ставишь и все к чертям летит - 1 и то же значение может пройти 3 раза например, а некоторые ни разу, если разбанят напишу норм гайд под .NET Framework 2.0 с любым числом потоков, минус будет 1 - что будет идти не по порядку(берет значения рандомно), но ни 1 не будет пропущено
Можно попроще сделать. Я хорошо прокомментировал
(консольное приложение .net 4, по сути просто считает в потоках)
PHP код:
using System; using System.Collections.Generic; using System.Threading;
namespace ConsoleApplication1 { internal class Program { static public List<Thread> Threads = new List<Thread>();//Главный массив потоков static public int Counter;//Ненужный глобальный счётчик private static void Main(string[] args) { const int maxThreads = 100;//Количество потоков int i = 0;//просто ненужный счётчик while (true)//бесконечный цикл { //Thread.CurrentThread.Join(100);
if (Threads.Count >= maxThreads) continue; //Если потоков больше чем нужно то пропускаем цикл, если нет ,то идём дальше if (Counter>=1000) break;//При достижении глобального счётчика 1к вырубаем цикл (ну и программу)
i++; var th = new Thread(ThreadWorker){Name="login",IsBackground=true};//инициализируем новый поток с имем login и делаем его фоновым th.Start(new object[] {"login", "domaine", "password",i});//Cтартуем новый поток и передаём ему 4 параметра Threads.Add(th);//Добавляем поток в глобальный массив потоков
if(false)//Импровизация возможностей { Threads.Find(thI=>thI.Name=="test").Abort();//находим поток с именем test и останавливаем его }
}
Console.ReadKey(); }
public static void ThreadWorker(object obj) { var objTemp = (object[])obj;
var login = (string)objTemp[0]; var domaine = (string)objTemp[1]; var password = (string)objTemp[2];
/* * TODO:Можем делать что хотим * то ниже например выводит в консоль переданный параметр */
var counter = (int)objTemp[3];//Получаем счётчик который пришёл с параметром
Console.WriteLine(counter); Counter++;//+1 к глобальному счётчику Thread.CurrentThread.Join(5000);//Пауза потока на 5 секунд
Threads.Remove(Thread.CurrentThread);//Как всё сделаем удаляем текущий поток из массива потоков
}
} }
Сорцы можете скачать: [Ссылки могут видеть только зарегистрированные пользователи. ]
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось Puzer; 26.01.2012 в 19:38.
Можно попроще сделать. Я хорошо прокомментировал
(консольное приложение .net 4, по сути просто считает в потоках)
PHP код:
using System;
using System.Collections.Generic;
using System.Threading;
namespace ConsoleApplication1
{
internal class Program
{
static public List<Thread> Threads = new List<Thread>();//Главный массив потоков
static public int Counter;//Ненужный глобальный счётчик
private static void Main(string[] args)
{
const int maxThreads = 100;//Количество потоков
int i = 0;//просто ненужный счётчик
while (true)//бесконечный цикл
{
//Thread.CurrentThread.Join(100);
if (Threads.Count >= maxThreads) continue; //Если потоков больше чем нужно то пропускаем цикл, если нет ,то идём дальше
if (Counter>=1000) break;//При достижении глобального счётчика 1к вырубаем цикл (ну и программу)
i++;
var th = new Thread(ThreadWorker){Name="login",IsBackground=true};//инициализируем новый поток с имем login и делаем его фоновым
th.Start(new object[] {"login", "domaine", "password",i});//Cтартуем новый поток и передаём ему 4 параметра
Threads.Add(th);//Добавляем поток в глобальный массив потоков
if(false)//Импровизация возможностей
{
Threads.Find(thI=>thI.Name=="test").Abort();//находим поток с именем test и останавливаем его
}
}
Console.ReadKey();
}
public static void ThreadWorker(object obj)
{
var objTemp = (object[])obj;
var login = (string)objTemp[0];
var domaine = (string)objTemp[1];
var password = (string)objTemp[2];
/*
* TODO:Можем делать что хотим
* то ниже например выводит в консоль переданный параметр
*/
var counter = (int)objTemp[3];//Получаем счётчик который пришёл с параметром
Console.WriteLine(counter);
Counter++;//+1 к глобальному счётчику
Thread.CurrentThread.Join(5000);//Пауза потока на 5 секунд
Threads.Remove(Thread.CurrentThread);//Как всё сделаем удаляем текущий поток из массива потоков
}
}
}
Сорцы можете скачать: [Ссылки могут видеть только зарегистрированные пользователи. ]
Если сам сделал то ты крут )
Только пихай код в обычный тег [CODE]. А то буйство красок PHP кода убивает глаза и мозг....
очевидно прочитать поток, а дальше Encoding.%YourEncoding%.GetString(%yourbuffer%), зачем вот только
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
•theSaboteur•, ты меня маленько не понял.
Там конструкция, читает все строки из ричтекстбокса и записывает их в текстовый фаил, а потом каждый поток начинает читать из файла по 1 строке. О_о ВотЪ.
Yukikaze, извиняюсь)
В очередной раз поленился прочитать пост полностью..
Кстати и тут поизвращаться можно)))
Скажем подгрузить весь файл в память, разбить на строки и вогнать в стек/очередь)
Ну и прочее садо/мазо
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Ну как бы это ужасный многопоток. Но для одного действия подойдет. А если действий много? То данные будут теряться.
И лутче переменую счёта обьявить в потоке тоесть в процедуре
Код:
int index_thread = main;
main++;
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961
Последний раз редактировалось the-boxi; 28.01.2012 в 23:19.