powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отмена запроса в idHttp
13 сообщений из 13, страница 1 из 1
Отмена запроса в idHttp
    #39739436
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть поток с компонентом инди, который выполняет запрос. Этот запрос может выполняться около минуты.
Вот код.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
type
  TResponseCallback = procedure(const URL, S : String) of object;

  THttpThread = class(TThread)
  strict protected
    FHttp : TIdHTTP;
    FUrl  : string;
    FOnResponse : TResponseCallback;
    function GetIsWorking: Boolean; virtual;
  protected
    procedure Execute; override; //Исполнение потока сервера
  public
    constructor Create(const AHttp : TIdHTTP; const AUrl : string); virtual;
    procedure Start; virtual;
    procedure Stop; virtual;
    property IsWorking : Boolean read GetIsWorking;
    property OnResponse  : TResponseCallback read FOnResponse write FOnResponse;
  end;

{ THttpThread }

constructor THttpThread.Create(const AHttp : TIdHTTP; const AUrl : string);
begin
  inherited Create(True);
  FreeOnTerminate := False;
  FHttp := AHttp;
  FUrl := AUrl;
end;

procedure THttpThread.Execute;
var source : TStringStream;
begin
  source := TStringStream.Create('', TUTF8Encoding.Create);
  try
    while not Terminated do begin
      try
        source.Clear;
        FHttp.Post(FUrl, nil, source, nil);
        if Terminated then
          Exit;
      except
        if Terminated then
          Exit;
        raise;
      end;

      if (FHttp.Response.ResponseCode = 200) then begin
        if Assigned(FOnResponse) then begin
          Synchronize(procedure ()
            begin
              FOnResponse(FURL, source.DataString);
            end);
        end;
      end;
    end;
    FHttp.Disconnect;
  finally
    source.Free;
  end;
end;

function THttpThread.GetIsWorking: Boolean;
begin
  Result := Started and not Finished;
end;

procedure THttpThread.Start;
begin
  if not Suspended or IsWorking then //Если поток запущен или уже работает
    Exit; //Выходим

  if Finished then //Если поток уже остановился, то выдаем ошибку
    raise Exception.Create('Поток уже завершен');

  Suspended := false; //Запускаем поток сервера
end;

procedure THttpThread.Stop;
begin
  if not IsWorking then //Поток не работает
    Exit; //выходим

  if Suspended then //Если поток по каким-то причинам остановлен
    Suspended := false; //Возобновляем его работу

  Terminate; //Принудительно устанавливаем флаг остановки потока
  if FHttp.Connected then
    FHttp.Disconnect;
  WaitFor; //Ждем завершение потока
end;



Поток останавливаю при помощи функции Stop. Функция Stop вызывается из главного потока.
В общем есть ли в данном коде грабли и какие:
if FHttp.Connected then FHttp.Disconnect; - так можно вызывать из главного потока.
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39739444
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу узнать, как правильно закрывать Connection у idHttp.
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39739671
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, надо в каком-нибудь событии у FHttp проверять какую-нибудь переменную и есть True, то останавливать выполнение запроса
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39739718
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
проблема в том, что идет запрос к серверу и дальше ожидание ответа от сервера. Сервер может ответить в любое время или по истечении например 1 минуты или выход по timeout.
Сервер ответил, обработал запрос и дальше снова запрос к серверу.
Так что не понятно какое событие обрабатывать, чтобы остановить запрос?
Иногда возникает необходимость остановить весь процесс.
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39739824
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Послать сообщение серверу с командой на отмену.
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39739948
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat, Я доступа к серверу не имею. К тому же запрос уже обрабатывается :(
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39739955
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обломись тогда.
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39739965
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
Поэтому я хочу сделать force close, думаю в приведенном коде есть грабли или нет с точки зрения потоков?
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39740019
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014if FHttp.Connected then FHttp.Disconnect; - так можно вызывать из главного потока.Нужно смотреть код Http.Disconnect, но скорее всего нет. Я бы попробовал добраться до хэндла сокета и сделать ему closesocket. А вообще вам нужен обычный неблокирующий сокет
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39740133
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Пробовал Closesocket, но тоже сомневаюсь :(
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39740147
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

Если сокет стоит на блокировке (например, на тайм-ауте), то, насколько я знаю, можно только убить поток TerminateThread. Решение плохое. Если возможно - то лучше работать с неблокирующими сокетами.
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39740161
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Семь бед - один free.
...
Рейтинг: 0 / 0
Отмена запроса в idHttp
    #39740172
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonЕсли сокет стоит на блокировке (например, на тайм-ауте), то, насколько я знаю, можно
только убить поток TerminateThread.

Под Windows его из ожидания вышибет closesocket(). Под линуксом - shutdown(). Может, он и
под Windows тоже сработает, не проверял.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отмена запроса в idHttp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]