这是我的代码:
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组件发送。
答案 0 :(得分:3)
如果您担心无限循环,那么只需为您的循环实现超时,例如:
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;