Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2011, 17:18   #1
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость [C#] Потоки

Доброго времени суток.

Описалово: создаю 2 потока, задача потока - взять логин + пасс, авторизироваться, посетить группу, выйти из под аккаунта, взять слудующую пару акк + пасс и тд....

Допустим есть список:
логин1-пасс1
логин2-пасс2
логин3-пасс3
логин4-пасс4
логин5-пасс5
логин6-пасс6

Тойсть у меня должна отработать такая схема:
1й поток берет пару логин1-пасс1
2й поток берет пару логин2-пасс2
1й поток берет пару логин3-пасс3
2й поток берет пару логин4-пасс4
1й поток берет пару логин5-пасс5
2й поток берет пару логин6-пасс6
.................................

Но у меня отрабатывает только пара:
1й поток берет пару логин1-пасс1
2й поток берет пару логин2-пасс2

Скорее всего дело в синхронизации потоков....

Код:
Thread[] th = new Thread[2]; // создаю и запускаю два потока
            for (int i = 0; i < 2; i++)
            {
                th[i] = new Thread(new ParameterizedThreadStart(o.GG));
                Thread.Sleep(2);
                th[i].Start(i);
                Thread.Sleep(2);
            }

...............

        public void GG(object i)
        {
            while ((int)i < 10)
            {
                Auth(logins[(int)i + 2].ToString(), passwords[(int)i + 2].ToString(), "http://vkontakte.ru/clubхххххх");
                Thread.Sleep(2);
                i = (int)i +1;
            }
        }

.................



        public void Auth(String email, String pass,String url)
        {
            string html = "";
          
          HttpWebRequest req_auth = (HttpWebRequest)HttpWebRequest.Create("http://vkontakte.ru/login.php?m=1&email=" + email + "&pass=" + pass);
          
             
           HttpWebResponse myResponse = (HttpWebResponse)req_auth.GetResponse();
            StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.GetEncoding(1251));
            html = sr.ReadToEnd();

            Thread.Sleep(2);

            string hash = html.Substring(html.IndexOf("hash: '")+7,18);

            HttpWebRequest req_visit;
            HttpWebResponse res_visit=null;


            HttpWebRequest req_quit;
            HttpWebResponse res_quit=null;
            
            if (!hash.Contains("YPE html"))
            {
         
                req_visit = (HttpWebRequest)HttpWebRequest.Create(url);
                res_visit = (HttpWebResponse)req_visit.GetResponse();

                Thread.Sleep(2);
               
                req_quit = (HttpWebRequest)HttpWebRequest.Create("http://login.vk.com/?act=logout&hash=" + hash + "&from_host=vkontakte.ru");
                res_quit = (HttpWebResponse)req_quit.GetResponse();



            }
            myResponse.Close();
            res_visit.Close();
            res_quit.Close();
        }
Lemo вне форума Ответить с цитированием
Старый 24.05.2011, 20:46   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Ошибки здесь:
Код:
            res_visit.Close();
            res_quit.Close();
переменные могут иметь значение null.
И здесь получается двойной проход по массивам:
Код:
        public void GG(object i)
        {
            while ((int)i < 10)
            {
                Auth(logins[(int)i + 2].ToString(), passwords[(int)i + 2].ToString(), "http://vkontakte.ru/clubхххххх");
                Thread.Sleep(2);
                i = (int)i +1;
            }
        }
Посмотрите мой пример:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net;
using System.IO;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            List<LoginPswrd> list = new List<LoginPswrd>()
            {
                new LoginPswrd("1", "1"),
                new LoginPswrd("2", "2"),
                new LoginPswrd("3", "3"),
                new LoginPswrd("4", "4"),
                new LoginPswrd("5", "5"),
                new LoginPswrd("6", "6"),
                new LoginPswrd("7", "7")
            };

            ThreadSafeExtractor<LoginPswrd> extractor = new ThreadSafeExtractor<LoginPswrd>(list);


            SomeClass o = new SomeClass(extractor);
            Thread[] th = new Thread[2]; // создаю и запускаю два потока
            for (int i = 0; i < th.Length; i++)
            {
                th[i] = new Thread(new ThreadStart(o.GG));
                Thread.Sleep(2);
                th[i].Start();
                Thread.Sleep(2);
            }

            Console.WriteLine("Console.ReadKey()");
            Console.ReadKey();
        }
    }

    public class SomeClass
    {
        public ThreadSafeExtractor<LoginPswrd> Extractor { get; private set; }

        public SomeClass(ThreadSafeExtractor<LoginPswrd> extractor)
        {
            if (extractor == null)
                throw new ArgumentNullException("extractor");

            this.Extractor = extractor;
        }

        public void GG()
        {
            Console.WriteLine("Start GG");

            LoginPswrd lp = Extractor.NextElement();

            while (lp != null)
            {
                Console.WriteLine("Login=" + lp.Login);

                Auth(lp.Login, lp.Password, "http://www.google.ru");
                Thread.Sleep(2);

                lp = Extractor.NextElement();
            }
            Console.WriteLine("End GG");
        }

        public void Auth(String email, String pass, String url)
        {
            Console.WriteLine("Start Auth");
            string html = "";

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.google.ru");


            using (HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse())
            using (StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.GetEncoding(1251)))
            {
                html = sr.ReadToEnd();
            }

            Thread.Sleep(2);

            string hash = html.Substring(html.IndexOf("hash: '") + 7, 18);

            if (!hash.Contains("YPE html"))
            {
                req = (HttpWebRequest)HttpWebRequest.Create(url);
                using (HttpWebResponse res_visit = (HttpWebResponse)req.GetResponse())
                { }

                Thread.Sleep(2);

                req = (HttpWebRequest)HttpWebRequest.Create("http://www.google.ru");

                using (HttpWebResponse res_quit = (HttpWebResponse)req.GetResponse())
                { }
            }

            Console.WriteLine("End Auth");
        }
    }

    public class LoginPswrd
    {
        public string Login;
        public string Password;

        public LoginPswrd()
        { }

        public LoginPswrd(string login, string password)
        {
            this.Login = login;
            this.Password = password;
        }
    }

    public class ThreadSafeExtractor<T> where T: class
    {
        private Object _lockObject = new Object();
        private ICollection<T> _collection;
        public int _currectIndex = -1;

        public ThreadSafeExtractor(ICollection<T> collection)
        {
            if (collection == null)
                throw new ArgumentNullException("collection");

            this._collection = collection;
        }

        public T NextElement()
        {
            lock (_lockObject)
            {
                return _collection.ElementAtOrDefault(++_currectIndex);
            }
        }
    }
}
P.S. Только замените адрес google на свой.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 24.05.2011 в 20:49.
Daramant вне форума Ответить с цитированием
Старый 24.05.2011, 21:50   #3
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

спс, все норм работает.
Lemo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. FieStik Общие вопросы C/C++ 4 23.05.2011 14:12
Потоки Владимир Чернов Помощь студентам 0 08.12.2010 23:56
Потоки fredwriter Общие вопросы Delphi 20 13.11.2010 04:16
Потоки _PROGRAMM_ Помощь студентам 9 26.09.2010 19:27
Потоки StudeHt Помощь студентам 1 06.05.2010 16:26