Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Indy+Proxy=Отвал потока (https://forum.antichat.xyz/showthread.php?t=198607)

ange007 23.04.2010 17:12

Indy+Proxy=Отвал потока
 
Что-то сегодня всё спрашивают про потоки и всё с ними связанное.
Сегодня всемирный день Threads?

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

Пример:
Код:


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;


maestro-ant 25.04.2010 23:06

отладчиком нужно ловить. лучше б выложил ехе

ange007 26.04.2010 02:25

Позже может выложу.
Потоки валятся не постоянно, а иногда.
В принципе от прокси зависит это всё.
Но всё-равно интересно.

M_script_ 26.04.2010 02:58

Цитата:

Сообщение от ange007
Позже может выложу.
Потоки валятся не постоянно, а иногда.
В принципе от прокси зависит это всё.
Но всё-равно интересно.

Поэтому инди и не использую. Говорят, что обновление инди помогает, но сам не пробовал.

GhostOnline 26.04.2010 13:06

Что такое
Цитата:

ReleaseThread(Self);
?

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

Я делаю так:
PHP код:

procedure TMythread.Execute
begin 
InterLockedIncrement
(ThreadsCount);//Увеличиваем счетчик запущенных потоков 
try 
   while 
not Terminated do   
     
begin     
       
try       
         
MyProcedure();//Выполняем в цикле процедуру, в которой и находится основной код потока     
       
except end;   
    
end
finally
InterLockedDecrement(ThreadsCount);//Уменьшаем счетчик потоков 
end
end


ange007 27.04.2010 01:06

Цитата:

Поэтому инди и не использую. Говорят, что обновление инди помогает, но сам не пробовал.
Нет времени перейти на что-то другое.
Нет времени изучать толком.
Обновления много когда не только не улучшают но и очень сильно ухудшают ситуацию...вот такая вот фигня получается.
Цитата:

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


Время: 14:46