9

Delphi 2006 と Indy 10 を使用しています。フォームを作成し、IdHttpServer コンポーネントをドロップダウンします。サーバーをアクティブに設定するフォームの OnCreate イベントを作成し、サーバーの OnCommandGet に次の行を入力します。

procedure TForm3.IdHTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
   Beep;
   Sleep(10000);
   AResponseInfo.ContentText := DateTimeToStr(Now);
end;

10 秒間のスリープに注意してください。

次に、2 つのブラウザーを使用して Firefox でテストします。最初のものを「localhost」に接続すると、すぐにビープ音が聞こえます。次に、2 番目のブラウザーにタブで移動し、localhost に接続します (10 秒以内) が、すぐにはビープ音が鳴りません。最初のリクエストが完了するのを待ってビープ音を鳴らし、さらに 10 秒間待ちます。

これらのコンポーネントはマルチスレッドだと思いましたか? 私が思ったように動作させるために設定できるプロパティはありますか (両方の要求がすぐに応答されます)。

4

3 に答える 3

11

インディではなくTIdHTTPServer、この行動に責任があります!それはウェブブラウザです!

Firefoxは、同じサーバーでさまざまな要求のTCP接続を共有します。

そのため、Firefoxは同じURIに対する2つのリクエストをシリアル化します。2つの異なるブラウザ(IEとFirefoxなど)を同時に開きhttp://localhost/、両方でリクエストすると、期待どおりの結果が得られます。

そして、あなたの質問への答え:はい、もちろん、すべてのTIdHTTPServer.OnCommandGetイベントは独自の「スケジューラー」スレッドで実行され、同時に実行することができます。

于 2009-04-17T23:45:02.843 に答える
1

Indy 10 idHTTPServer を使用しましたが、これマルチスレッドです。アプリをブロックしているのは、「ビープ音」または「スリープ」コマンドである可能性があります。コンポーネントはマルチスレッドですが、一部のコマンドはプロセス全体をロックする可能性があるためです。

于 2009-04-17T18:17:50.650 に答える