2009-04-17 15 views
7

Używam Delphi 2006 i Indy 10. Tworzę formularz i rozwijam komponent IdHttpServer. I zrobić OnCreate imprezę dla formularza, aby ustawić serwer aktywny, i wprowadzić te wiersze dla OnCommandGet serwera:Delphi/Indy IdHttpServer nie wielowątkowy?

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

Uwaga snu przez 10 sekund.

Następnie testuję w przeglądarce Firefox, używając 2 przeglądarek. Pierwszy łączy się z "localhost" i od razu słyszę sygnał dźwiękowy. Następnie przechodzę do drugiej przeglądarki i łączę się z localhost (w mniej niż 10 sekund), ale nie od razu. Czeka na zakończenie pierwszego żądania, a następnie sygnał dźwiękowy i czeka kolejne 10 sekund.

Myślałem, że te komponenty były wielowątkowe? Czy jest jakaś własność, którą mogę ustawić tak, aby zachowywała się tak jak myślałam (oba żądania zostaną natychmiast odebrane).

+1

Można sprawdzić, czy wszystko działa w tym samym wątku, zwracając format ("% d% d", [MainThreadID, GetCurrentThreadID]) dla wartości ContentText. Jeśli jest to naprawdę wielowątkowe, dwie wartości, które otrzymasz w każdym żądaniu, będą się różnić od siebie, a drugie wartości obu odpowiedzi będą prawdopodobnie również różne. –

+0

Gdybym mógł cię zainteresować alternatywą: zacząłem http://xxm.sourceforge.net/, aby otworzyć projekt, nad którym pracowałem, który mógłby rozwiązać ten i podobne problemy. Nie próbowałem tego na Delphi 2006, ale jest oparty na Delphi 7, ale przy odrobinie szczęścia powinien działać. –

Odpowiedz

9

Nie Indy i TIdHTTPServer jest odpowiedzialny za to zachowanie! To przeglądarka internetowa!

Firefox udostępnia połączenie TCP dla różnych żądań na tym samym serwerze.

Firefox serializuje 2 żądania tego samego identyfikatora URI. Otwórz jednocześnie dwie różne przeglądarki (na przykład IE i Firefox), poproś o http://localhost/ w obu, a uzyskasz oczekiwany wynik.

Odpowiedź na pytanie: Tak, oczywiście, każde zdarzenie TIdHTTPServer.OnCommandGet jest wykonywane we własnym wątku "scheduler" i może być wykonywane jednocześnie.

+2

Tak, to jest to! Użyłem przeglądarki Firefox i Internet i uzyskałem oczekiwane wyniki, dziękuję bardzo! W moim kodzie pojawił się błąd, który pokazywał to samo zachowanie, więc gdy zobaczyłem, że Firefox też to robi, założyłem, że mój kod był doskonały ... –

0

Użyłem Indy 10 idHTTPServer i to jest wielowątkowy. Co blokuje twoją aplikację to polecenie "beep" lub "sleep". Ponieważ chociaż komponent jest wielowątkowy, niektóre polecenia mogą nadal blokować cały proces.

+0

Z jakiegoś powodu Indy czeka na zakończenie pierwszego żądania, zanim uruchomi OnCommandGet dla drugiej prośby. To tak, jakby zawinęło metodę OnCommandGet w sekcji Krytyczne. Może używać różnych wątków dla każdego żądania, ale to nie ma sensu, jeśli Indy nadal uruchamia je seryjnie. Funkcje Beep i Sleep nie zablokują INNYCH wątków. –

+0

Ponieważ opracowałem kompletną aplikację ze składnikiem, jestem pewien, że jest to wielowątkowe. Jeśli nie będzie problemu, opublikuj swój kod i przeanalizujmy go razem, aby znaleźć problem;) – BYK

+1

Dzięki, spróbuj kodu z tego linku, daj mi znać, co widzisz: http://www.benziegler.com/ stuff/IndyTest.zip –

Powiązane problemy