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

Код: 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
27.11.2018, 22:53
    #39739444
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
Хочу узнать, как правильно закрывать Connection у idHttp.
...
Рейтинг: 0 / 0
28.11.2018, 12:32
    #39739671
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
Думаю, надо в каком-нибудь событии у FHttp проверять какую-нибудь переменную и есть True, то останавливать выполнение запроса
...
Рейтинг: 0 / 0
28.11.2018, 13:18
    #39739718
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
X11,
проблема в том, что идет запрос к серверу и дальше ожидание ответа от сервера. Сервер может ответить в любое время или по истечении например 1 минуты или выход по timeout.
Сервер ответил, обработал запрос и дальше снова запрос к серверу.
Так что не понятно какое событие обрабатывать, чтобы остановить запрос?
Иногда возникает необходимость остановить весь процесс.
...
Рейтинг: 0 / 0
28.11.2018, 14:52
    #39739824
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
Послать сообщение серверу с командой на отмену.
...
Рейтинг: 0 / 0
28.11.2018, 16:57
    #39739948
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
rgreat, Я доступа к серверу не имею. К тому же запрос уже обрабатывается :(
...
Рейтинг: 0 / 0
28.11.2018, 17:06
    #39739955
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
Обломись тогда.
...
Рейтинг: 0 / 0
28.11.2018, 17:13
    #39739965
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
rgreat,
Поэтому я хочу сделать force close, думаю в приведенном коде есть грабли или нет с точки зрения потоков?
...
Рейтинг: 0 / 0
28.11.2018, 18:15
    #39740019
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
ziv-2014if FHttp.Connected then FHttp.Disconnect; - так можно вызывать из главного потока.Нужно смотреть код Http.Disconnect, но скорее всего нет. Я бы попробовал добраться до хэндла сокета и сделать ему closesocket. А вообще вам нужен обычный неблокирующий сокет
...
Рейтинг: 0 / 0
28.11.2018, 22:40
    #39740133
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
_Vasilisk_,
Пробовал Closesocket, но тоже сомневаюсь :(
...
Рейтинг: 0 / 0
28.11.2018, 23:42
    #39740147
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отмена запроса в idHttp
ziv-2014,

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

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


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