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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2014, 02:07   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Зависание потока

Привет.

Запускаю прогу, работает всего несколько минут, далее поток повисает.

В чем может быть дело?

Код:
type
  CHECK = class(TThread)
    IdHTTP2: TIdHTTP;
    NameFile,SourceFile,DestFile:string;
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Update;
    function DownloadFile(SourceFile, DestFile: string): Boolean;
  end;

var
  Form1: TForm1;
  CHE:CHECK;


function CHECK.DownloadFile(SourceFile, DestFile: string): Boolean;
begin
  try
    Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
  except
    Result := False;
  end;
end;

procedure CHECK.Update;
begin
  DestFile := ExtractFilePath(Application.Exename)+'123.jpg';
  if DownloadFile(SourceFile, DestFile) then
    begin
      Form1.Image1.Picture.LoadFromFile(DestFile);
      MessageBox(Handle,'текст','заголовок',MB_ICONINFORMATION+MB_OK);
    end
end;

procedure CHECK.Execute;
  var
    html,img,search:string;
begin
  IdHTTP2:=TIdHTTP.Create(nil);
  IdHTTP2.HandleRedirects:=True;
  IdHTTP2.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201';
  IdHTTP2.ReadTimeout:=20000;

  while not Terminated do
    begin
      html:=IdHTTP2.Get('ссылка'); // в html получаем ссылку на картинку
      Sleep(500);

      if Pos('ERROR',html) = 0 then
        begin

          SourceFile := Trim(html);
          Synchronize(Update);

        end;
    end;

  IdHTTP2.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Button2.Tag = 0 then
    begin
      Button2.Tag:=1;
      Button2.Caption:='Остановить';
      CHE:=CHECK.Create();
      CHE.FreeOnTerminate:=True;
      CHE.Resume;
      CHE.Priority:=tpNormal;
      CHE.OnTerminate := ENDTerminated;
    end
    else
    begin
      Button2.Tag:=0;
      Button2.Enabled:=False;
      Button2.Caption:='Останавливаем';
      CHE.Terminate;
    end;
end;

procedure TForm1.ENDTerminated(Sender: TObject);
begin
  Button2.Enabled:=True;
  Button2.Caption:='Начать';
end;

Последний раз редактировалось bilibian; 01.03.2014 в 02:15.
bilibian вне форума Ответить с цитированием
Старый 03.03.2014, 17:46   #2
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Неужели никто не знает причину?
bilibian вне форума Ответить с цитированием
Старый 03.03.2014, 18:42   #3
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от bilibian Посмотреть сообщение
Неужели никто не знает причину?
Где обработка исключений IdHTTP2.Get?
К примеру сервер ответил ошибкой. Поток рухнул. Дальше что?

Последний раз редактировалось XE5; 03.03.2014 в 18:46.
XE5 вне форума Ответить с цитированием
Старый 03.03.2014, 19:44   #4
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Записал так:

Код:
procedure CHECK.Execute;
  var
    html,img,search:string;
begin
  IdHTTP2:=TIdHTTP.Create(nil);
  IdHTTP2.HandleRedirects:=True;
  IdHTTP2.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201';
  IdHTTP2.ReadTimeout:=20000;

  while not Terminated do
    begin
       try
         html:=IdHTTP2.Get('ссылка'); // в html получаем ссылку на картинку
         Sleep(500);

         if Pos('ERROR',html) = 0 then
         begin

           SourceFile := Trim(html);
           Synchronize(Update);

         end;
       except end;
    end;

  IdHTTP2.Free;
end;
bilibian вне форума Ответить с цитированием
Старый 03.03.2014, 20:00   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

а зачем тут слип?
eval вне форума Ответить с цитированием
Старый 03.03.2014, 20:23   #6
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от bilibian Посмотреть сообщение
Записал так
Очень интересно. Жаль никакой информации о результате. Видимо оно Нам нужно, а не Вам.
P.S. Вопрос на засыпку. Будет ли выполнена синхронизация при исключении HTTP?
XE5 вне форума Ответить с цитированием
Старый 03.03.2014, 20:35   #7
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от XE5 Посмотреть сообщение
Очень интересно. Жаль никакой информации о результате. Видимо оно Нам нужно, а не Вам.
Цикл крутится, пока не висло, но до этого я писал другой код и там на каждом запросе было исключение. Все работало тип-топ. А когда проходит очень большое кол-во времени (примерно сутки), то все потоки идут в отказ. То есть с виду программа работает, а инфу не обрабатывает. Когда пытаешься исполнить Терминайт запущенным потокам, то программа сама повисает намертво и ошибок не выдает.

Хотелось бы это тоже прояснить.

Цитата:
Сообщение от XE5 Посмотреть сообщение
Будет ли выполнена синхронизация при исключении HTTP?
Если сервер возвращает ERROR вместо ссылки на картинку, то синхронизация не нужна и в исключении выполнена не будет.
bilibian вне форума Ответить с цитированием
Старый 03.03.2014, 20:51   #8
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от bilibian Посмотреть сообщение
Если сервер возвращает ERROR вместо ссылки на картинку, то синхронизация не нужна и в исключении выполнена не будет.
А если будет сбой соединения, и сервер вообще ничего не вернёт, что тогда произойдёт?

Код:
procedure CHECK.Execute;
  var
    html,img,search:string;
    b: boolean; //ошибка
begin
  IdHTTP2:=TIdHTTP.Create(nil);
  IdHTTP2.HandleRedirects:=True;
  IdHTTP2.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201';
  IdHTTP2.ReadTimeout:=20000;

  while not Terminated do
    begin
       b := false; // инициализация датчика ошибок
       try
         html:=IdHTTP2.Get('ссылка'); // в html получаем ссылку на картинку
         Sleep(500);
       except 
         b := true; // отловили ошибку 
      end;

      if (Pos('ERROR',html) = 0) and (b = false) then // если сервер не ответил ERROR и не было сбоя соединения то...
         begin
           SourceFile := Trim(html);
           Synchronize(Update);
         end;
    end;
  IdHTTP2.Free;
end;

Последний раз редактировалось XE5; 03.03.2014 в 21:03.
XE5 вне форума Ответить с цитированием
Старый 03.03.2014, 21:49   #9
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

XE5, смысл в этом датчике?

Если будет ошибка соединения и пр., то уходим в исключение. До этого кода просто дело не дойдет:

Код:
if Pos('ERROR',html) = 0 then
begin

   SourceFile := Trim(html);
   Synchronize(Update);

end;
bilibian вне форума Ответить с цитированием
Старый 03.03.2014, 21:59   #10
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

bilibian Смысл очень прост. Всё что Вы заключили в секцию try ни как не обрабатывается на предмет ошибок. В том числе и
Код:
Synchronize(Update);
Уверены, что не хотите видеть ошибки синхронизации? Сомневаюсь.
XE5 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50
зависание DeDoK Работа с сетью в Delphi 7 17.08.2010 09:56
Зависание JRcoker Общие вопросы Delphi 8 06.08.2008 08:29