2011-12-28 61 views
2

非同期的にポーリングを使用私のコードです:このような状況でXMLHttpRequestがここでのreadyState

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を使用する必要はありません。

質問: は、私がSend呼び出す後、4の値をreadyStateにポーリングすることが安全である、または無限ループで立ち往生する危険性がありますか?


いくつかの事実:

ServerXMLHTTPRequestは、ループ内waitForResponseを使用することができますが、私はXMLHTTPRequestコンポーネントを使用します。 そこのことを述べている:

waitForResponse方法は、XMLHTTPコンポーネントを使用して非同期 送信を待つための唯一の方法である のreadyStateプロパティ、ポーリングよりも効率的です。

答えて

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; 
+0

実際に私はこの(多かれ少なかれ)のようなタイムアウトを追加することで滑走ました。なぜApplication.HandleMessageを使用するのではなく、MsgWaitForMultipleObjectsが必要なのでしょうか? – kobik

+0

'Application.ProcessMessages()'、あるいは 'Application.HandleMessage()'を呼び出すことは、元々やっていたようなタイトなループではお勧めできません。非常に非効率的で、さまざまな問題を引き起こすことが知られています。 'MsgWaitForMultipleObjects()'は、保留中のメッセージがある時を知らせます。まだ処理するものがない場合は、 'Application.ProcessMessages()'または 'Application.HandleMessage()'を呼び出す必要はありません。 –

+0

'MsgWaitForMultipleObjcts()'は、メッセージが到着するか、指定されたタイムアウトが経過するまで、呼び出し側のスレッドを効率的なスリープ状態にして、 'XMLHTTP'オブジェクトにバックグラウンド作業を行うためのタイムスライスを与えます。 –

関連する問題