2009-04-17 27 views
7

Delphi 2006 ve Indy 10 kullanıyorum. Bir form oluşturun ve bir IdHttpServer bileşenini bırakın. Sunucu aktif ayarlamak için form için bir OnCreate olayını olun ve ben sunucunun OnCommandGet için bu satırları girin:Delphi/Indy IdHttpServer çok iş parçacıklı değil mi?

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

Not 10 saniye boyunca uyku.

Daha sonra 2 tarayıcı kullanarak Firefox ile test ediyorum. İlk önce "localhost" a bağlanıyorum ve hemen bir bip sesi duyuyorum. Daha sonra 2. tarayıcıya geçiyorum ve localhost'a (10 saniyeden daha az) bağlanmasını sağlayın, ancak hemen bip sesini duymuyor. 1. isteğin tamamlanmasını bekler, sonra bip sesi çıkarır ve 10 saniye daha bekler.

Bu bileşenlerin çok iş parçacıklı olduğunu düşündüm? Olduğunu düşündüğüm şekilde davranmasını sağlayacak bazı özellikler var mı (her iki istek de hemen cevaplanacaktır).

+1

Her öğenin ContentText değeri için Format ('% d% d', [MainThreadID, GetCurrentThreadID]) döndürerek, aynı konu üzerinde çalışıp çalışmadığını kontrol edebilirsiniz. Gerçekten çok iş parçacıklıysa, her istekte aldığınız iki değer birbirinden farklı olacak ve her iki yanıtın ikinci değerleri de muhtemelen farklılık gösterecektir. –

+0

Eğer bir alternatifi ilginizi çekebilirsem: http://xxm.sourceforge.net/, üzerinde çalıştığım bir projeyi bu ve benzer sorunları çözebilecek açık kaynağa açtım. Henüz Delphi 2006'da denemedim, Delphi 7'ye dayanıyor, ama biraz şansla işe yaramalı. –

cevap

9

Bu davranıştan Indy ve TIdHTTPServer sorumludur! Bu web tarayıcısı!

Firefox, aynı sunucudaki farklı istekler için TCP bağlantısını paylaşır.

Dolayısıyla, Firefox aynı URI için 2 istekleri seri hale getirir. Aynı anda 2 farklı tarayıcıyı açın (ör. IE ve Firefox), her ikisinde de http://localhost/ isteyin ve beklenen sonucu elde edersiniz.

Ve sorunuzun cevabı: Evet, elbette, her bir TIdHTTPServer.OnCommandGet olayı kendi "zamanlayıcı" iş parçacığında yürütülür ve eşzamanlı olarak yürütülebilir.

+2

Evet, işte bu! Firefox ve Internet Explorer'ı kullandım ve beklenen sonuçları aldım, çok teşekkürler! Kodumda aynı davranışı gösteren bir hata oluştu, bu yüzden Firefox'u da gördüğümde kodumun mükemmel olduğunu düşündüm ... –

0

Indy 10 idHTTPServer'ı kullandım ve , multithread. Uygulamanızı engelleyen şey "bip" veya "uyku" komutu olabilir. Bileşen çoklu olmasına rağmen, bazı komutlar tüm süreci hala kilitleyebilir.

+0

Bazı nedenlerden dolayı Indy, ikinci istek için OnCommandGet'i iptal etmeden önce 1. isteğin tamamlanmasını bekliyor. Onun gibi Kritik bir bölümde OnCommandGet yöntemini sarmış gibi. Her istek için farklı iş parçacıkları kullanıyor olabilir, ancak Indy hala bunları seri halinde çalıştırıyorsa, bunun bir faydası yoktur. Bip ve Uyku işlevleri, bazı DİĞER iş parçacığını engellemez. –

+0

Bileşen ile tam bir uygulama geliştirdiğimden bu yana eminim multiithread. Kodunuzda bir sorun olmayacaksa ve sorunu bulmak için birlikte inceleyelim;) – BYK

+1

Teşekkürler, bu bağlantıdan kodu deneyin, ne gördüğünü bana bildirin: http://www.benziegler.com/ stuff/IndyTest.zip –

İlgili konular