Что-то сегодня всё спрашивают про потоки и всё с ними связанное. Сегодня всемирный день 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;
Позже может выложу. Потоки валятся не постоянно, а иногда. В принципе от прокси зависит это всё. Но всё-равно интересно.
Что такое ? У тебя я вообще что-то не вижу выполнение цикла в потоке. Т.е получается что поток один раз выполняется и завершается? Я делаю так: PHP: procedure TMythread.Execute; begin InterLockedIncrement(ThreadsCount);//Увеличиваем счетчик запущенных потоков try while not Terminated do begin try MyProcedure();//Выполняем в цикле процедуру, в которой и находится основной код потока except end; end; finally InterLockedDecrement(ThreadsCount);//Уменьшаем счетчик потоков end; end;
Нет времени перейти на что-то другое. Нет времени изучать толком. Обновления много когда не только не улучшают но и очень сильно ухудшают ситуацию...вот такая вот фигня получается. Да.