XMLHTTPRequest используется асинхронный опрос ReadyState - PullRequest
2 голосов
/ 28 декабря 2011

Вот мой код:

var
  xhttp: OleVariant;

xhttp := CreateOleObject('MSXML2.XMLHTTP');
xhttp.Open('GET', URL, True);
xhttp.send();

while xhttp.readyState <> 4 do
begin
  Application.HandleMessage;        
end;

// status property is available only when readyState is complete
if (xhttp.Status = 200) then... 
// do something

В этой ситуации я не хочу использовать событие onreadystatechange.

Вопрос: Безопасно лидля опроса на readyState для значения 4, после я звоню Send, или есть риск застрять в бесконечном цикле?


Некоторые факты:

ServerXMLHTTPRequest может использовать waitForResponse внутри цикла, но я хочу использовать XMLHTTPRequest компонент.Там указано, что:

Метод waitForResponse более эффективен, чем опрос свойства readyState, который является единственным способом ожидания асинхронной отправки с использованием компонента XMLHTTP.

1 Ответ

3 голосов
/ 29 декабря 2011

Если вас беспокоит бесконечный цикл, просто установите время ожидания для вашего цикла, например:

var 
  xhttp: OleVariant; 
  Ticks: DWORD;

  function TimeoutElapsed: Boolean;
  var
    Cur, Elapsed: DWORD;
  begin
    Cur := GetTickCount();
    if Cur >= Ticks then
      Elapsed := Cur - Ticks
    else
      Elapsed := (MAXDWORD - Ticks) + Cur;
    Result := (Elapsed >= 15000);
  end;

begin
  xhttp := CreateOleObject('MSXML2.XMLHTTP'); 
  xhttp.Open('GET', URL, True); 
  xhttp.send(); 

  Ticks := GetTickCount();
  while (xhttp.readyState <> 4) and (not TimeoutElapsed()) do
  begin
    if MsgWaitForMultipleObjects(0, nil, False, 1000, QS_ALLINPUT) = WAIT_OBJECT_0 then
      Application.ProcessMessages();         
    Ticks := GetTickCount();
  end; 

  // status property is available only when readyState is complete 
  if xhttp.readyState = 4 then
  begin
    if (xhttp.Status = 200) then...  
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...