TThread + httpPostURL [вопрос закрыт]

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

TThread + httpPostURL [вопрос закрыт]

Сообщение vitaly_l » 03.03.2014 22:55:44

Код: Выделить всё

procedure TMyThread.Execute;
var ...
begin
    if httpPostURL(sURLString, sSubmitString, sResultStream) then //Synapse
        begin
           ShowMessage(sResultStream.DataString);
           Terminate;
        end;
end;


Запускается вышеприведённый код по onButtonClick, в котором есть var MyThread : TMyThread.Create(True);
Код, отправляет запрос на сервер и получает ответ. Всё фурычит.

Печалька в том, что если, сделать запрос два раза подряд, например с разницей в секунду,
то ИНОГДА второй Thread.Execute ловит http ответ на первый запрос...

:?: Вот как это победить? :? :cry:
:?: Не отправлять второй запрос пока не придёт ответ на первый или есть другие решения?

PS: Заранее благодарен всем и каждому за Ваш ответ.

.
Последний раз редактировалось vitaly_l 04.03.2014 19:18:20, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TThread + httpPostURL (Synapse)

Сообщение Ichthyander » 04.03.2014 11:32:28

Честно говоря непонятно. Но проблема не в приведенном коде. У меня более десятка потоков запускается и каждый работает отдельно. Тоже использую Synapse как с одним и тем же сервером так и с разными. Соединения-то разные, почему один поток должен получать ответа с сервера по другому потоку. Как у вас определяется, что "второй Thread.Execute ловит http ответ на первый запрос"? Может проблема в самом сервере. Он что-то путает? Может недоглядели где-то в коде и sResultStream берет результаты первого запроса, когда второй по какой-то причине не получает ответа?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: TThread + httpPostURL (Synapse)

Сообщение vitaly_l » 04.03.2014 11:46:57

Ichthyander писал(а):Может проблема в самом сервере. Он что-то путает?

Да??? А как Synapse сможет определить для какого потока пришёл ответ с сервера? И с какого сервера?
Или в Synapse проверяется на соответствие "номеру" запроса? Но тогда должна быть boolean отключения. :?: Это есть?

И как поток определит "Это ответ для моего запроса boolean"?
Я так понимаю что, если ответ попал на "первый такт процессора", то его получает первый поток на "второй такт" второй поток и т.д.
А Вы возможно не видите т.к. Вам без разницы какой из потоков получит ответ?
Я даже не представляю как тут синхронизацию организовать?
Или я чего-то не понимаю?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TThread + httpPostURL (Synapse)

Сообщение Ichthyander » 04.03.2014 11:54:50

Код: Выделить всё
function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    WriteStrToStream(HTTP.Document, URLData);
    HTTP.MimeType := 'application/x-www-form-urlencoded';
    Result := HTTP.HTTPMethod('POST', URL);
    if Result then
      Data.CopyFrom(HTTP.Document, 0);
  finally
    HTTP.Free;
  end;
end;

Это из модуля HttpSend. Synapse делает запрос и ждет ответа сервера заданное в TimeOut время. В течении этого времени поток, в котором делался запрос получает ответ (все операции с сокетами и т.д. synapse берет на себя) в стандартном случае. И обрабатывает в этом потоке ответ, который сохраняется в вашем случае в объекте типа TStringList - sResultStream. Если за это время сервер не ответил поток также продолжает выполнение, только возвращается код ошибки HTTP сервер не ответил или типа того, не помню точно. Вот и все. То есть обработка происходит синхронно, не знаю правильно ли я выразидся, а не асинхронно как думаете Вы

Добавлено спустя 3 минуты 53 секунды:
Функция httpPostURL возвращает ЛОЖЬ в случае, если ответ не был получен за отведенное время. При этом с sResultStream ничего не происходит
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: TThread + httpPostURL (Synapse)

Сообщение vitaly_l » 04.03.2014 12:18:33

Я понял почему Вы не видели, я то запускаю в TThread и потоки (несколько запросов) обрабатываются как бы параллельно.
А если запустить без потоков, то всё будет работать правильно, но при этом программа "подвисает" на некоторый промежуток времени, при отправке. Чтобы убрать "подвисания", я сделал запрос через TThread, но появился глюк с путаницей ответов.

Я посмотрел в коде Synapse function THTTPSend.HTTPMethod(const Method, URL: string): Boolean; ,
там на соответствие не проверяется; только время и ошибки проверяют.

Или я ошибаюсь? Или я неправильно делаю, что запустил это как отдельную TThread?
Но тогда как, при запуске: httpPostURL - убрать подвисания программы?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TThread + httpPostURL (Synapse)

Сообщение Ichthyander » 04.03.2014 16:25:44

Я же говорил, что все делается во множестве потоков параллельно и все соединения с сервером выполняются параллельно. Соединения не могут перепутаться, потому что в каждому потоке в функции httpPostUrl создается свое соединение. Просто подвисает не основной поток, а тот поток, который исполняет функцию httpPostURL. Вы все правильно делаете, что работаете в функцией httpPostURL не в основном потоке программы. Просто ошибку ищете не там
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 686
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: TThread + httpPostURL (Synapse)

Сообщение vitaly_l » 04.03.2014 17:46:16

Ichthyander писал(а):Соединения не могут перепутаться, потому что в каждому потоке в функции httpPostUrl создается свое соединение.

Сделал лог... Вы оказались правы... У меня, номер инкриминировался в каждой триаде и был глобальным для всех триад. И поэтому произошла путаница.

Код: Выделить всё
Отправка и ответ сервера
Номер Thread:2 ответ: 1 2014-03-04 17:33:53
Номер Thread:2 ответ: 2 2014-03-04 17:33:53
Номер Thread:3 ответ: 3 2014-03-04 17:33:54
Номер Thread:5 ответ: 4 2014-03-04 17:33:54
Номер Thread:5 ответ: 5 2014-03-04 17:33:54
Номер Thread:6 ответ: 6 2014-03-04 17:33:54
Номер Thread:8 ответ: 7 2014-03-04 17:33:54
Номер Thread:8 ответ: 8 2014-03-04 17:33:54
Номер Thread:9 ответ: 9 2014-03-04 17:33:54
Номер Thread:10 ответ: 10 2014-03-04 17:33:55
Номер Thread:11 ответ: 11 2014-03-04 17:33:55
Номер Thread:12 ответ: 12 2014-03-04 17:33:55
Номер Thread:13 ответ: 13 2014-03-04 17:33:56
Номер Thread:14 ответ: 14 2014-03-04 17:33:56
Номер Thread:15 ответ: 15 2014-03-04 17:34:06
Номер Thread:17 ответ: 16 2014-03-04 17:34:06
Номер Thread:17 ответ: 17 2014-03-04 17:34:06
Номер Thread:18 ответ: 18 2014-03-04 17:34:06
Номер Thread:20 ответ: 19 2014-03-04 17:34:07
Номер Thread:20 ответ: 20 2014-03-04 17:34:07
Номер Thread:22 ответ: 21 2014-03-04 17:34:07
Номер Thread:23 ответ: 22 2014-03-04 17:34:07
Номер Thread:23 ответ: 23 2014-03-04 17:34:07
Номер Thread:25 ответ: 24 2014-03-04 17:34:07
Номер Thread:25 ответ: 25 2014-03-04 17:34:07
Номер Thread:26 ответ: 26 2014-03-04 17:34:08
Номер Thread:28 ответ: 27 2014-03-04 17:34:08
Номер Thread:29 ответ: 28 2014-03-04 17:34:08
Номер Thread:29 ответ: 29 2014-03-04 17:34:08
Номер Thread:31 ответ: 30 2014-03-04 17:34:08
Номер Thread:32 ответ: 31 2014-03-04 17:34:08
Номер Thread:33 ответ: 32 2014-03-04 17:34:08
Номер Thread:34 ответ: 33 2014-03-04 17:34:09
Номер Thread:35 ответ: 34 2014-03-04 17:34:09
Номер Thread:35 ответ: 35 2014-03-04 17:34:09
Номер Thread:37 ответ: 36 2014-03-04 17:34:09
Номер Thread:38 ответ: 37 2014-03-04 17:34:09
Номер Thread:39 ответ: 38 2014-03-04 17:34:09
Номер Thread:39 ответ: 39 2014-03-04 17:34:09
Номер Thread:40 ответ: 40 2014-03-04 17:34:10
Номер Thread:42 ответ: 41 2014-03-04 17:34:10
Номер Thread:42 ответ: 42 2014-03-04 17:34:10
Номер Thread:44 ответ: 43 2014-03-04 17:34:10
Номер Thread:45 ответ: 44 2014-03-04 17:34:10
Номер Thread:45 ответ: 45 2014-03-04 17:34:10
Номер Thread:46 ответ: 46 2014-03-04 17:34:11
Номер Thread:48 ответ: 47 2014-03-04 17:34:11
Номер Thread:48 ответ: 48 2014-03-04 17:34:11
Номер Thread:50 ответ: 49 2014-03-04 17:34:11
Номер Thread:51 ответ: 50 2014-03-04 17:34:11
Номер Thread:52 ответ: 51 2014-03-04 17:34:11
Номер Thread:53 ответ: 52 2014-03-04 17:34:11
Номер Thread:53 ответ: 53 2014-03-04 17:34:12
Номер Thread:55 ответ: 54 2014-03-04 17:34:12
Номер Thread:55 ответ: 55 2014-03-04 17:34:12

а теперь всё правильно считает

Номер Thread:1 ответ: 1 2014-03-04 18:09:07
Номер Thread:2 ответ: 2 2014-03-04 18:09:07
Номер Thread:3 ответ: 3 2014-03-04 18:09:07
Номер Thread:4 ответ: 4 2014-03-04 18:09:07
Номер Thread:5 ответ: 5 2014-03-04 18:09:07
Номер Thread:6 ответ: 6 2014-03-04 18:09:07
Номер Thread:7 ответ: 7 2014-03-04 18:09:08
Номер Thread:8 ответ: 8 2014-03-04 18:09:08
Номер Thread:9 ответ: 9 2014-03-04 18:09:08
Номер Thread:10 ответ: 10 2014-03-04 18:09:08
Номер Thread:11 ответ: 11 2014-03-04 18:09:08
Номер Thread:12 ответ: 12 2014-03-04 18:09:08
Номер Thread:13 ответ: 13 2014-03-04 18:09:09
Номер Thread:14 ответ: 14 2014-03-04 18:09:09
Номер Thread:15 ответ: 15 2014-03-04 18:09:09
Номер Thread:16 ответ: 16 2014-03-04 18:09:09
Номер Thread:17 ответ: 17 2014-03-04 18:09:09
Номер Thread:18 ответ: 18 2014-03-04 18:09:09
Номер Thread:19 ответ: 19 2014-03-04 18:09:09
Номер Thread:20 ответ: 20 2014-03-04 18:09:10
Номер Thread:21 ответ: 21 2014-03-04 18:09:10
Номер Thread:22 ответ: 22 2014-03-04 18:09:10
Номер Thread:23 ответ: 23 2014-03-04 18:09:10
Номер Thread:24 ответ: 24 2014-03-04 18:09:10
Номер Thread:25 ответ: 25 2014-03-04 18:09:10
Номер Thread:26 ответ: 26 2014-03-04 18:09:11
Номер Thread:27 ответ: 27 2014-03-04 18:09:11
Номер Thread:28 ответ: 28 2014-03-04 18:09:11
Номер Thread:29 ответ: 29 2014-03-04 18:09:11
Номер Thread:30 ответ: 30 2014-03-04 18:09:11
Номер Thread:31 ответ: 31 2014-03-04 18:09:11
Номер Thread:32 ответ: 32 2014-03-04 18:09:11
Номер Thread:33 ответ: 33 2014-03-04 18:09:12
Номер Thread:34 ответ: 34 2014-03-04 18:09:12
Номер Thread:35 ответ: 35 2014-03-04 18:09:12
Номер Thread:36 ответ: 36 2014-03-04 18:09:12
Номер Thread:37 ответ: 37 2014-03-04 18:09:12
Номер Thread:38 ответ: 38 2014-03-04 18:09:12
Номер Thread:39 ответ: 39 2014-03-04 18:09:12
Номер Thread:40 ответ: 40 2014-03-04 18:09:13
Номер Thread:41 ответ: 41 2014-03-04 18:09:13
Номер Thread:42 ответ: 42 2014-03-04 18:09:13
Номер Thread:43 ответ: 43 2014-03-04 18:09:13
Номер Thread:44 ответ: 44 2014-03-04 18:09:13
Номер Thread:45 ответ: 45 2014-03-04 18:09:13
Номер Thread:46 ответ: 46 2014-03-04 18:09:14
Номер Thread:47 ответ: 47 2014-03-04 18:09:14
Номер Thread:48 ответ: 48 2014-03-04 18:09:14
Номер Thread:49 ответ: 49 2014-03-04 18:09:14
Номер Thread:50 ответ: 50 2014-03-04 18:09:14
Номер Thread:51 ответ: 51 2014-03-04 18:09:14
Номер Thread:52 ответ: 52 2014-03-04 18:09:15
Номер Thread:53 ответ: 53 2014-03-04 18:09:15
Номер Thread:54 ответ: 54 2014-03-04 18:09:15
Номер Thread:55 ответ: 55 2014-03-04 18:09:16 


Большое человеческое спасибо!


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41


Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru