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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2014, 20:43   #1
stasa9711
Форумчанин
 
Регистрация: 01.10.2012
Сообщений: 106
По умолчанию Проблемы с потоком

Добрый день , сделал поток который просто переходит по ссылкам , что загружены в accounts , но вот где то я намудрил , и гет запрос идет только , сколько я поставил потоков, к примеру : ссылок загрузил 50 , а потоков поставил 30 , то гет запрос был произведен 31 раз .....

вот как вызываю :
Код:
 Acc3:=-1;
 prox:=-1;
 Work3:=true;
 for Thread3:=0 to form3.sSpinEdit1.Value do
 TStas.Create(false);
 Thread3:=form3.sSpinEdit1.Value;
вот сам поток :
Код:
procedure TStas.Execute;
var CurAcc, TP:integer;
    HTTP:THTTPSend;
    IP, Port:string;
    data:TStringStream;
    HTML, src:TStringList;
begin
 while Work3 do
  begin
   CS.Enter;
    Inc(Acc3);  Inc(prox);
    if Acc3<Accounts.Count then CurAcc:=Acc3 else Work3:=false;
    if prox<Proxy.Count-1 then TP:=prox else begin
      prox:=0;
      TP:=prox;
    end;
   CS.Leave;

   if Work3 then
    begin

     //copy login

     //copy proxy
     if Proxy.Text = '' then
     begin
      sleep(0);
     end
      else
     begin
     IP:=Copy(Proxy[TP], 1, Pos(':', Proxy[TP])-1);
     Port:=Copy(Proxy[TP],Pos(':',Proxy[TP])+1,Length(Proxy[TP]));
     end;

     HTTP:=THTTPSend.Create;
     //Заголовки
     with HTTP do begin
      Headers.Add('Referer: http://mail.ru/');
      Headers.Add('Cache-Control: max-age=0');
      Headers.Add('Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01');
      MimeType:='application/x-www-form-urlencoded';
     // UserAgent:=GetRandomUserAgent;
      Headers.Add('Origin: http://mail.ru');
      Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3');
      Headers.Add('Accept-Encoding: gzip, deflate');
      Headers.Add('Connection: keep-alive');
     end;

     //POST
     data:=Tstringstream.Create;
     data.WriteString('email='+ Flogin+'&password='+ Fpassword+'&log_in=');
     HTTP.Document.LoadFromStream(data);

     //Proxy
     if Proxy.Text = '' then
      begin
      sleep(0)
      end else
     begin
     //socks
     if proxymode='socks' then
     begin
     HTTP.Sock.SocksIP:=IP;
     HTTP.Sock.SocksPort:=Port;
     end;
     //HTTP
     if proxymode='http' then
     begin
     HTTP.ProxyHost:=IP;
     HTTP.ProxyPort:=Port;
     end;
     end;


     if HTTP.HTTPMethod('GET', accounts[CurAcc]) then begin
    Flogin:=accounts[CurAcc];
     if pos('200', HTTP.Headers.Text)<>0 then
     begin
 
     Rezult:=1;
     end else
     begin
     Rezult:=0;
     end;
    
 //    form3.Memo1.Lines.Add('====  '+ HTTP.Headers.Text);
     HTTP.Free;
     src.Free;
     data.Free;

     Synchronize(Sync);
    end;
  end;

 dec(Thread3);
 if Thread3=0 then stopbrute();
end;

что не так я сделал ? + в другом приложении анологичная проблема, только гет запросы идет чуть дольше , тобишь загрузил 1000 ссылок , поставил 100 потоков, а перешло всего 150-200 .... ну мнеб с этим разобраться ... жду ваших советов ибо сам не знаю ...
stasa9711 вне форума Ответить с цитированием
Старый 23.03.2014, 22:09   #2
stasa9711
Форумчанин
 
Регистрация: 01.10.2012
Сообщений: 106
По умолчанию

помогите... неужели никто не знает ?
stasa9711 вне форума Ответить с цитированием
Старый 23.03.2014, 23:00   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как я понял ты создаешь кол-во потоков описанное в sSpinEdit1.
А соответственно такое же число ссылок и будет загружено.
Смекаешь? Тебе нужно видимо такое:
Код:
repeat
 for Thread3:=0 to form3.sSpinEdit1.Value do begin
  with TStas.Create(true) do begin
   FreeOnTerminate:=true;
   Start;
  end;
 end;
until Кол-Во_Ссылок=0;
А в каждом потоке по завершению опиши метод, который будет вызываться с синхронизацией в самом конце потока, и уменьшать на единицу Кол-Во_Ссылок.

Только не забудь: Если Кол-Во_Ссылок будет меньше чем sSpinEdit1.Value - могут быть проблемы, так что это тоже придется учитывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.03.2014, 23:14   #4
stasa9711
Форумчанин
 
Регистрация: 01.10.2012
Сообщений: 106
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
until Кол-Во_Ссылок=0;
тобишь ссылки я загружаю в переменную accounts (типа стринглист) это будет выглядеть тогда так : accounts.Count=0; ?

Цитата:
Сообщение от Stilet Посмотреть сообщение
А в каждом потоке по завершению опиши метод, который будет вызываться с синхронизацией в самом конце потока, и уменьшать на единицу Кол-Во_Ссылок.
т.е ? это удалять ссылку с переменной accounts ? это примерно выглядеть будет так : accounts.delete(accounts[curacc]) ?

и еще , при вызове таким образом (только изменил кнопку вызова, поток не трогал ) сначала дает ошибку, что не хватает памяти , но переходит по всем запросам норм ! как убрать ошибку о нехватки памяти ?
stasa9711 вне форума Ответить с цитированием
Старый 23.03.2014, 23:18   #5
stasa9711
Форумчанин
 
Регистрация: 01.10.2012
Сообщений: 106
По умолчанию

хотя нет , я поток подправил в начала заменил while Work3 do на while Acc3<Accounts.Count do и убрал if Work3 then begin + убрал один end; в конце, только тогда она дает ошибку , но все же переходит по всем ссылкам, в другом случае только дает ошибку .... как убрать ошибку ?
вот такая ошибка : thread creation error недостаточно памяти для обработки команды
stasa9711 вне форума Ответить с цитированием
Старый 24.03.2014, 09:21   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тебе нужно делать так называемый пул потоков. Т.е. нужен список потоков, у которого есть некий предел, в твоем случае sSpinEdit1.
Так вот в этом пуле (Допустим это еще одна Thread) нужно в цикле проверять количество работающих потоков, и если оно меньше предела - создавать новый поток и дописывать его в список, хранящий работающие потоки.
У меня сейчас нет времени написать полностью что я имею ввиду, но тебе нужно использовать TThreadList для хранения списка потоков.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.03.2014, 12:37   #7
stasa9711
Форумчанин
 
Регистрация: 01.10.2012
Сообщений: 106
По умолчанию

не работал с TThreadList , в рунете нашел что-то типо этого :
Код:
Var
List: TList;
i: Integer;
begin
MyThreadList=TThreadeList.Create;
i:=0;
Repeat
try
List:=MyThreadList.LockList;
If List.Count<3 Then
Begin
MyThreadList.Add(MyThread.Create(False));
Inc(i);
End;
finally
MyThreadList.UnlockList
until i>5
примерно это ты имел в виду ? но, при 1 заходе List.Count= 0 , а при втором заходе он уже больше 3 ... (с этой ошибкой автор этого кода обратился , но он сам ее решил не добавив правильный код ) подскажи , как правильно будет ?
stasa9711 вне форума Ответить с цитированием
Старый 24.03.2014, 18:00   #8
stasa9711
Форумчанин
 
Регистрация: 01.10.2012
Сообщений: 106
По умолчанию

помогите ...неужели никто помочь не может ?
stasa9711 вне форума Ответить с цитированием
Старый 24.03.2014, 18:21   #9
stasa9711
Форумчанин
 
Регистрация: 01.10.2012
Сообщений: 106
По умолчанию

жаль ... ят думал
stasa9711 вне форума Ответить с цитированием
Старый 24.03.2014, 22:35   #10
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Цитата:
жаль ... ят думал
Что ты думал? Что описал пример своей ошибки и тебя подкоректировали? Открываешь поисковик, вбил delphi пул потоков и изучай, делов то. А потом уже пиши что именно не получилось
bulldog5293 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с потоком Aleksandr Общие вопросы Delphi 1 28.03.2013 18:45
Проблемы с потоком HELMOS Общие вопросы Delphi 16 01.02.2013 23:30
Проблемы с потоком spydark91 Общие вопросы Delphi 38 23.06.2011 16:23
Работа с потоком Yur@ Общие вопросы Delphi 3 02.06.2011 12:46
Проблема с потоком Araver Общие вопросы Delphi 4 16.10.2007 04:30