Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Ответ
 
Опции темы
Старый 04.03.2012, 16:17   #1
 Разведчик
Аватар для thezoke
 
thezoke никому не известный тип
Регистрация: 04.03.2012
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для thezoke с помощью ICQ
 
По умолчанию C# Многопоточность

Вот нормальный урок многопоточности в отличие от этого

Если будут вопросы пишите, особы я не тестировал.
Если что-то не так будет пишите.

Для начала добавим элемент.
У меня вот так выглядит.

[Ссылки могут видеть только зарегистрированные пользователи. ]
Далее добавить директивы using
Код:
using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Threading;
Объявим переменные
Код:
Thread[] threads; // Обьявляем массив потоков
        int i = 0; // позиция
        String[] lines = null; // Массив сайтов
        Object locks = new Object(); // Object для lock
Добавим такой код на кнопку "старт".
Почти весь код прокомментирован так что я здесь объяснять не буду.

Код:
lines = richTextBox1.Lines;
            i = 0;
            if (lines.Length < 1) 
            {
                MessageBox.Show(this, "Слишком мало сайтов, попробуйте снова!", "Threads Example", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return;
                // завершаем если строк меньше 1
            }
            threads = new Thread[(int)numericUpDown1.Value]; 
            for (int q = 0; q < threads.Length; q++)
            {
                threads[q] = new Thread(main); // поток будет запускать функцию main
                threads[q].Start(); // запускаем
              }
             new Thread(waitth).Start();
Добавим две функций. Для отправки get запроса и ожидание завершения работы потоков.

Код:
private void waitth()
        {
            for (int q = 0; q < threads.Length; q++)
            {
                threads[i].Join(); // ожидаем когда потом закончится
            }
            MessageBox.Show(this, "Работа завершена!", "Threads Example", MessageBoxButtons.OK, MessageBoxIcon.Stop);   
        }
        public string get(string _url, CookieCollection Cooks) // функция для отправки get запроса
        {
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(_url);
                webRequest.CookieContainer = new CookieContainer();
                webRequest.AllowAutoRedirect = false; // автоматическая переадресация
                webRequest.Timeout = 30000; // время ожидания загрузки страницы
                webRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19";
                
                if (Cooks != null)
                    webRequest.CookieContainer.Add(Cooks);
                using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
                {
                    webResponse.Cookies = webRequest.CookieContainer.GetCookies(webRequest.RequestUri);
                    if (webResponse.Cookies != null)
                        Cooks.Add(webResponse.Cookies);
                    string dataContent = new StreamReader(webResponse.GetResponseStream(), Encoding.GetEncoding(1251)).ReadToEnd();
                    string end = webResponse.Headers.ToString();
                    return end + dataContent;
                }
            }
            catch
            {
                return null; // если была ошибка в загрузке страницы возвращаем null
            }
        }
На кнопку стоп

Код:
for (int q = 0; q < threads.Length; q++)
            {
                threads[i].Abort(); // прерываем поток
            }
Ну и главная функция

Код:
private void main()
        {
            while (true)
            {
                string url;
                lock (locks) // доступ только с одного потока, блокирует доступ с остальных и они в процессе ожидания.
                {
                    if (i > lines.Length - 1) // проверяем не весь ли массив прошли
                    {
                        break; // останавливаем поток
                    }
                    url = lines[i]; // здесь понятно
                    i++; // всё равно что i = i +1; или i += 1;
                    if (!url.Contains("http://"))  // проверяем, если в линке нету http:// начинаем цикл заново. url.Contains("http://") == False - тоже самое
                    {
                        continue; // завершаем потом
                    }
                }
                CookieCollection Cooks = new CookieCollection(); // создаём куки менеджер, автоматическии обрабатытает куки
                get(url, Cooks); // отправляем get запрос

            }
        }

Последний раз редактировалось thezoke; 06.03.2012 в 13:56.
  Ответить с цитированием
Старый 06.03.2012, 03:51   #2
 Разведчик
Аватар для sergiktipok
 
sergiktipok никому не известный тип
Регистрация: 18.11.2011
Сообщений: 10
Популярность: 17
Сказал(а) спасибо: 28
Поблагодарили 12 раз(а) в 10 сообщениях
 
По умолчанию Re: C# Многопоточность

многопоток не работает!доходят только два запроса!
________________
Не забываем ставить спасибо или жать + на весах!
Skype-hammer3399
  Ответить с цитированием
Старый 06.03.2012, 15:46   #3
Почетный Пользователь
 Рыцарь
Аватар для the-boxi
 
the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(
Регистрация: 09.02.2011
Сообщений: 373
Популярность: 38009
Сказал(а) спасибо: 612
Поблагодарили 448 раз(а) в 175 сообщениях
Отправить сообщение для the-boxi с помощью ICQ Отправить сообщение для the-boxi с помощью MSN Отправить сообщение для the-boxi с помощью Skype™
 
По умолчанию Re: C# Многопоточность

Слишком много всего, можно всё гараздо легче... Ты не пробовал всё в Одну процедуру хотябы засунуть?
Код:
new Thread(delegate(){
//код который выполнять потоку
}).Start();
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961

Последний раз редактировалось the-boxi; 06.03.2012 в 15:49.
  Ответить с цитированием
Старый 06.03.2012, 19:38   #4
 Разведчик
Аватар для thezoke
 
thezoke никому не известный тип
Регистрация: 04.03.2012
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для thezoke с помощью ICQ
 
По умолчанию Re: C# Многопоточность

Пробовал, так можно ещё и в одну строку написать.
  Ответить с цитированием
Старый 06.03.2012, 20:28   #5
 Старший сержант
Аватар для Sinyss
 
Sinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака Норриса
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
Отправить сообщение для Sinyss с помощью Skype™
 
По умолчанию Re: C# Многопоточность

Цитата:
Сообщение от thezokeПосмотреть сообщение
Пробовал, так можно ещё и в одну строку написать.

Любой код можно в 1 строку написать, но нужно ли?
  Ответить с цитированием
Старый 07.03.2012, 13:29   #6
 Разведчик
Аватар для thezoke
 
thezoke никому не известный тип
Регистрация: 04.03.2012
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для thezoke с помощью ICQ
 
По умолчанию Re: C# Многопоточность

Цитата:
Сообщение от WebHosterПосмотреть сообщение
А в чем, собственно, разница?

стиль программирования другой
  Ответить с цитированием
Старый 07.03.2012, 18:53   #7
 Разведчик
Аватар для thezoke
 
thezoke никому не известный тип
Регистрация: 04.03.2012
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для thezoke с помощью ICQ
 
По умолчанию Re: C# Многопоточность

Цитата:
Сообщение от rif009Посмотреть сообщение

Самая частая ошибка при программирование на .net
надо закрывать потоки

webResponse.Close();
так же для всех стреам и тд

Урок был многопоточности, а не отправки get запроса.
Там вроде автоматический закрывает, я точно не помню.

Последний раз редактировалось thezoke; 07.03.2012 в 19:00.
  Ответить с цитированием
Старый 27.03.2012, 17:17   #8
 Разведчик
Аватар для JLeGioH
 
JLeGioH на правильном путиJLeGioH на правильном пути
Регистрация: 26.09.2011
Сообщений: 1
Популярность: 159
Сказал(а) спасибо: 0
Поблагодарили 9 раз(а) в 5 сообщениях
Отправить сообщение для JLeGioH с помощью ICQ Отправить сообщение для JLeGioH с помощью Skype™
 
По умолчанию Re: C# Многопоточность

Открою секрет для тех кто незнает)
Цитата:
threads = new Thread[(int)numericUpDown1.Value];
for (int q = 0; q < threads.Length; q++)
{
threads[q] = new Thread(main); // поток будет запускать функцию main
threads[q].Start(); // запускаем
}

равно на все 100%
єтому:
Цитата:
for (int q = 0; q < (int)numericUpDown1.Value; q++)
{
Thread threads = new Thread(main); // поток будет запускать функцию main
threads.Start(); // запускаем
}

Каждый раз будет создаваться другой поток и первый никуда не денется)
+ Метод МАЙН будет для каждого потока свой индивидуальный(клавное парвильно потокобезопасность сделать)

(Сори за ошЫбки))
________________
Ася 4492два2
  Ответить с цитированием
Старый 27.03.2012, 18:50   #9
Почетный Пользователь
 Рыцарь
Аватар для the-boxi
 
the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(
Регистрация: 09.02.2011
Сообщений: 373
Популярность: 38009
Сказал(а) спасибо: 612
Поблагодарили 448 раз(а) в 175 сообщениях
Отправить сообщение для the-boxi с помощью ICQ Отправить сообщение для the-boxi с помощью MSN Отправить сообщение для the-boxi с помощью Skype™
 
По умолчанию Re: C# Многопоточность


Ну вообще проше всего вызывать потоки таким методом:
Код:
for (int q = 0; q < (int)numericUpDown1.Value; q++)
new Thread(delegate(){Выполняемый код}).Start();
Либо не делегатом и писать код внутри, а ссылаться на процедуру
Код:
for (int q = 0; q < (int)numericUpDown1.Value; q++)
new Thread(процедура).Start();
И контролировать поток внутри будет проще всего. То есть сделать его бекграундом, и вызывать обрывание самого же себя после окончания работы.
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961
  Ответить с цитированием
Старый 27.03.2012, 23:19   #10
 Старший сержант
Аватар для Sinyss
 
Sinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака Норриса
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
Отправить сообщение для Sinyss с помощью Skype™
 
По умолчанию Re: C# Многопоточность

Цитата:
Сообщение от the-boxiПосмотреть сообщение

И контролировать поток внутри будет проще всего. То есть сделать его бекграундом, и вызывать обрывание самого же себя после окончания работы.

Не всегда потоки могут знать когда им выходить.
  Ответить с цитированием
Старый 27.03.2012, 23:57   #11
Почетный Пользователь
 Рыцарь
Аватар для the-boxi
 
the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(the-boxi сломал счётчик популярности :(
Регистрация: 09.02.2011
Сообщений: 373
Популярность: 38009
Сказал(а) спасибо: 612
Поблагодарили 448 раз(а) в 175 сообщениях
Отправить сообщение для the-boxi с помощью ICQ Отправить сообщение для the-boxi с помощью MSN Отправить сообщение для the-boxi с помощью Skype™
 
По умолчанию Re: C# Многопоточность

Цитата:
Сообщение от SinyssПосмотреть сообщение
Не всегда потоки могут знать когда им выходить.

Ну если не знаешь как работать с потоками, лучше туда не лезть. Но а вообще для этого существует библиотека майкрософта.
Метод Abort - Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток.
И для этого в конце процедуры пишешь
Код:
Thread.CurrentThread.Abort();
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961

Последний раз редактировалось the-boxi; 28.03.2012 в 00:01.
  Ответить с цитированием
Старый 28.03.2012, 00:55   #12
 Старший сержант
Аватар для Sinyss
 
Sinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака Норриса
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
Отправить сообщение для Sinyss с помощью Skype™
 
По умолчанию Re: C# Многопоточность

Цитата:
Сообщение от the-boxiПосмотреть сообщение
Ну если не знаешь как работать с потоками, лучше туда не лезть. Но а вообще для этого существует библиотека майкрософта.
Метод Abort - Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток.
И для этого в конце процедуры пишешь
Код:
Thread.CurrentThread.Abort();


Я умею работать с потоками.
Я имел в виду что потоки могут быть вечными(целенаправленно, например ожидание события)... Или ты можешь послать в поток такую задачу, которая никогда не выполнится(не намеренно), но будет работать правильно... Потому лучше потоки делать с глобальной областью видимости(для класса).
  Ответить с цитированием
Пользователь сказал cпасибо:
the-boxi (29.03.2012)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Руководство] Многопоточность C# xFroLx C# 22 02.03.2012 23:59
[Помогите!] Многопоточность =PaLeTiZaToR= Вопросы и ответы, обсуждения 2 08.01.2012 19:23
[delphi] Многопоточность TakeThat Pascal/Delphi 2 31.07.2010 07:42

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 20:07.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net