TTimer не? А чтоб прога не висла юзай в теле цикла Application.ProcessMessages... Ну и исключения не забывай, и что-то типа IdHttp.Disconnect...
юзай стандартный класс TThread. примеров на просторах интернета навалом (1-я ссылка из гугла тЫц). а чтоб поток не завершался сам по себе, необходимо ловить все исключительные ситуации (try except).
можешь ничего не писать, либо вывести в лог ошибку. код идущий между except end; будет выполнятся в случае ошибки (когда вываливается исключение), то есть там необходимо проводить обработку исключения (вывод ошибки или, как писал выше, запись в лог).
по идеи ничего, если в except произойдёт искл. то поток должен продолжить работу. а код там реально простой как два рубля... Создаём класс потока: TThreadEnter Code: unit ThreadEnterUnit; interface uses Classes, Windows, SysUtils, IdHTTP; type TThreadEnter = class(TThread) class var WorkOn : Boolean; class var Stop : Boolean; class var TimeGet : Integer; private { Private declarations } protected procedure Execute; override; end; implementation uses Unit1; { TThreadEnter } procedure TThreadEnter.Execute; var HTTP : TIdHTTP; begin (* Создаём объект HTTP *) HTTP := TIdHTTP.Create(nil); (* Настройка HTTP *) HTTP.AllowCookies := True; HTTP.HandleRedirects := True; (* Заголовки HTTP *) HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1'{USER_AGENTS[Random(21)]}; HTTP.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; HTTP.Request.AcceptLanguage := 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'; HTTP.Request.CharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7'; HTTP.Request.Connection := 'keep-alive'; try (* Крутит поток пока не умрёт *) while (not Stop) do begin (* Заходим по ссылке *) try HTTP.Get('http://yandex.ru'); except end; (* Обяъвлем на форму о работе *) Synchronize(procedure begin Form1.Memo1.Lines.Append('[' + TimeToStr(Now)+ ']: ' + 'Успешно зашли на страницу!!!'); end); if TimeGet > 0 then Sleep(TimeGet); end; finally (* Чистим за собой HTTP *) FreeAndNil(HTTP); end; end; end. На форму кидаем Memo1 и имя формы должно быть Form1 две кнопки и всё: Code: private { Private declarations } procedure EndThreadGetTIME(Sender: TObject); public implementation uses ThreadEnterUnit; (* Кнопка START *) procedure TForm1.ButtonStartClick(Sender: TObject); begin if TThreadEnter.WorkOn then Exit; TThreadEnter.WorkOn := True; TThreadEnter.Stop := False; TThreadEnter.TimeGet := 10000; // 10 секунд with TThreadEnter.Create(True) do begin FreeOnTerminate := True; Priority := tpLowest; OnTerminate := Self.EndThreadGetTIME; Resume; end; end; (* Кнопка STOP *) procedure TForm1.ButtonStopClick(Sender: TObject); begin if TThreadEnter.WorkOn then begin TThreadEnter.Stop := True; end; end; (* Сообщение о завершение работы *) procedure TForm1.EndThreadGetTIME(Sender: TObject); begin TThreadEnter.WorkOn := False; TThreadEnter.Stop := True; Memo1.Lines.Append('Поток завершил работу.'); end;
ссылку в студию, если не хочешь палить, тогда идём в яшку \ гуглик и там пишет - "Delphi отладка" читаем пару статей, разбираемся. Идём в код ставим бряк гуляем вместе с кодом.... находим ошибку. Решаем проблему и всё) Вообще советую книжечку прочитать и будет счастье) там и потоки и отладка и работа с сетью всё, что нужно на начинающих и не только). Мoжно еще в EndThread..... в конце кода поставить запуск потока ButtonSTART.Click; Как то так) будет бессмертный как Чак Норис
проверь логику процедур, выделение и освобождение ресурсов, корректность выполнения предшествующих запросов, для удобства можно логирование при отладке добавить с помощью директив компилятора: Code: {$DEFINE TEST} ............ {$IFDEF TEST}OutputDebugString(PChar(Format('%s',['info...'])));{$ENDIF} при этом в even log (ctrl+alt+v) будет выводиться твоя инфа, в общем дебаж