Indy+Proxy=Отвал потока

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ange007, 23 Apr 2010.

  1. ange007

    ange007 Member

    Joined:
    26 Aug 2009
    Messages:
    28
    Likes Received:
    21
    Reputations:
    0
    Что-то сегодня всё спрашивают про потоки и всё с ними связанное.
    Сегодня всемирный день Threads?

    Но раз на то пошло задам и я вопрос.
    Пытаюсь разобраться какого хрена иногда валятся потоки при юзании прокси.
    То-есть просто при запросе поток падает и всё.

    Пример:
    Code:
    
    procedure TVoteThread.Execute;
    var text:string;
    begin
      {--//--}
      FState := shReady;
      Synchronize(Start);
      FResult := 2;
      {Создаём компоненты}
      {}
      FH := TidHTTP.Create;
      FS := TIdIOHandlerStack.Create;
      {--//--}
      HTTPParms:=TStringList.Create;
      StreamParms := TStringStream.Create;
      {--//--}
      FH.IOHandler := FS;
      if FProxyTag=0 then FH.IOHandler := FS.MakeDefaultIOHandler(FH);
      if (FProxyTag=1) or (FProxyTag=2)  then
         begin
          SI := TIdSocksInfo.Create;
          SSL := TidSSLioHandlerSocketOpenSSL.create;
          SSL.SSLOptions.Method := sslvtlsv1;
          SSL.Port := 443;
          FH.IOHandler := SSL;
      end;
      FH.HandleRedirects := true;
      FH.HTTPOptions := [];
      FH.ReadTimeout := FTimeOut * 1000;
      FH.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7';
      FH.Request.Accept := 'text/html, */*';
      FH.Request.Connection := 'Keep-Alive';
      FH.Request.AcceptEncoding := 'identity';
    
    if FProxyTag=0 then
      begin
        FH.ProxyParams.ProxyServer := FProxyHost;
        if not (FProxyPort='') then FH.ProxyParams.ProxyPort := strtoint(FProxyPort);
        if not (FProxyUserName='') then FH.ProxyParams.ProxyUsername := FProxyUserName;
        if not (FProxyPassword='') then FH.ProxyParams.ProxyPassword := FProxyPassword;
    end;
    
    if (FProxyTag=1) or (FProxyTag=2)  then
      begin
        SI.Authentication := sanoAuthentication;
        SI.Host := FProxyHost;
        if not (FProxyPort='') then SI.Port := strtoint(FProxyPort);
        SI.Username := FProxyUserName;
        SI.Password := FProxyPassword;
          if FProxyTag=1 then SI.Version := svSocks4;
          if FProxyTag=2 then SI.Version := svSocks5;
        if not (FProxyUserName='') then SI.Authentication := saUsernamePassword;
        SSL.Transparentproxy := SI;
    end;
    
    {Основное выполнение потока}
      try
    
    try
    text:=FH.GET('http://');
    except
    FResult := 2;
    end;
    
      FState := shComplete;
      Synchronize(Complete);
      finally
        ReleaseThread(Self);
      end;
    end;
    
    
    
     
  2. maestro-ant

    maestro-ant New Member

    Joined:
    7 Jan 2007
    Messages:
    26
    Likes Received:
    4
    Reputations:
    6
    отладчиком нужно ловить. лучше б выложил ехе
     
  3. ange007

    ange007 Member

    Joined:
    26 Aug 2009
    Messages:
    28
    Likes Received:
    21
    Reputations:
    0
    Позже может выложу.
    Потоки валятся не постоянно, а иногда.
    В принципе от прокси зависит это всё.
    Но всё-равно интересно.
     
  4. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Поэтому инди и не использую. Говорят, что обновление инди помогает, но сам не пробовал.
     
  5. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Что такое
    ?

    У тебя я вообще что-то не вижу выполнение цикла в потоке. Т.е получается что поток один раз выполняется и завершается?

    Я делаю так:
    PHP:
    procedure TMythread.Execute
    begin 
    InterLockedIncrement
    (ThreadsCount);//Увеличиваем счетчик запущенных потоков 
    try 
       while 
    not Terminated do   
         
    begin     
           
    try       
             
    MyProcedure();//Выполняем в цикле процедуру, в которой и находится основной код потока     
           
    except end;   
        
    end
    finally
    InterLockedDecrement(ThreadsCount);//Уменьшаем счетчик потоков 
    end
    end;
     
    #5 GhostOnline, 26 Apr 2010
    Last edited: 26 Apr 2010
  6. ange007

    ange007 Member

    Joined:
    26 Aug 2009
    Messages:
    28
    Likes Received:
    21
    Reputations:
    0
    Нет времени перейти на что-то другое.
    Нет времени изучать толком.
    Обновления много когда не только не улучшают но и очень сильно ухудшают ситуацию...вот такая вот фигня получается.
    Да.