2009-04-17 31 views
7

私はDelphi 2006とIndy 10を使用しています。私はフォームを作成し、IdHttpServerコンポーネントをドロップダウンします。私は、アクティブなサーバを設定するためのフォームのOnCreateのイベントを作り、そして私は、サーバーのOnCommandGetためにこれらの行を入力します。Delphi/Indy IdHttpServerはマルチスレッドではありませんか?

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秒待ちます。

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

+1

ContentText値のFormat( '%d%d'、[MainThreadID、GetCurrentThreadID])を返すことで、すべてが同じスレッドで実行されているかどうかを確認できます。実際にマルチスレッド化されている場合は、各リクエストで得られる2つの値が互いに異なり、両方の応答の第2の値もおそらく異なるでしょう。 –

+0

私は代替案に興味があれば、私はhttp://xxm.sourceforge.net/をオープンソースにしています。これは、私がこれを取り組んでいるプロジェクトで、これと同様の問題を解決することができます。私はまだDelphi 2006でそれを試していない、それはDelphi 7に基づいていますが、少し運があればうまくいくはずです。 –

答えて

9

Indyでなく、TIdHTTPServerがこの問題の原因です。それはウェブブラウザです!

Firefoxは、同じサーバー上のさまざまなリクエストに対してTCP接続を共有します。

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

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

+2

はい、それです!私はFirefoxとInternet Explorerを使い、期待した結果を得ました。ありがとうございました! 私のコードに同じ動作を示すバグがありました。だから、Firefoxがそれをやっているのを見たときに私のコードは完璧だと思いました... –

0

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

+0

何らかの理由で、Indyは第1の要求が完了するのを待ってから、第2の要求に対してOnCommandGetを起動します。そのようにそれはOnCommandGetメソッドをクリティカルセクションでラップしています。それは、各要求に対して異なるスレッドを使用している可能性がありますが、Indyが依然としてそれらを連続して起動する場合は使用しません。 ビープ音とスリープ機能は、他のスレッドをブロックしません。 –

+0

私はコンポーネントで完全なアプリケーションを開発して以来、私はそれがマルチスレッドであると確信しています。コードを投稿しても問題が解決しない場合は、問題を見つけるために一緒に調べてみましょう) – BYK

+1

ありがとうございます。このリンクのコードを試してみてください。 http://www.benziegler.com/ stuff/IndyTest.zip –

関連する問題