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プロパティ、ポーリングよりも効率的です。
実際に私はこの(多かれ少なかれ)のようなタイムアウトを追加することで滑走ました。なぜApplication.HandleMessageを使用するのではなく、MsgWaitForMultipleObjectsが必要なのでしょうか? – kobik
'Application.ProcessMessages()'、あるいは 'Application.HandleMessage()'を呼び出すことは、元々やっていたようなタイトなループではお勧めできません。非常に非効率的で、さまざまな問題を引き起こすことが知られています。 'MsgWaitForMultipleObjects()'は、保留中のメッセージがある時を知らせます。まだ処理するものがない場合は、 'Application.ProcessMessages()'または 'Application.HandleMessage()'を呼び出す必要はありません。 –
'MsgWaitForMultipleObjcts()'は、メッセージが到着するか、指定されたタイムアウトが経過するまで、呼び出し側のスレッドを効率的なスリープ状態にして、 'XMLHTTP'オブジェクトにバックグラウンド作業を行うためのタイムスライスを与えます。 –