2009-04-17 16 views
7

Utilizzo Delphi 2006 e Indy 10. Creo un modulo e rilascio un componente IdHttpServer. Faccio un evento OnCreate per il modulo per impostare il server attivo, ed entro in queste righe per OnCommandGet del server:Delphi/Indy IdHttpServer non multithreading?

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

Annotare il sonno per 10 secondi.

Quindi eseguo il test con Firefox, utilizzando 2 browser. Ho il primo collegamento a "localhost" e sento subito un segnale acustico. Passo quindi al secondo browser e lo faccio collegarlo a localhost (in meno di 10 secondi), ma non emette un segnale acustico subito. Aspetta che la prima richiesta venga completata, quindi emette un segnale acustico e attende altri 10 secondi.

Ho pensato che questi componenti fossero multi-threaded? C'è qualche proprietà che posso impostare per far sì che si comporti come pensavo (entrambe le richieste otterrebbero una risposta immediata).

+1

È possibile controllare se tutto è in esecuzione sullo stesso thread restituendo Formato ('% d% d', [MainThreadID, GetCurrentThreadID]) per il valore ContentText. Se è realmente multithread, i due valori che ottieni in ciascuna richiesta saranno diversi tra loro e probabilmente anche i secondi valori di entrambe le risposte saranno diversi. –

+0

Se potessi interessarti in un'alternativa: ho avviato http://xxm.sourceforge.net/ per aprire un progetto su cui stavo lavorando che potrebbe risolvere questo e altri problemi simili. Non l'ho ancora provato su Delphi 2006, è basato su Delphi 7, ma con un po 'di fortuna dovrebbe funzionare. –

risposta

9

Non Indy e TIdHTTPServer è responsabile di questo comportamento! È il browser!

Firefox condivide la connessione TCP per richieste diverse sullo stesso server.

Quindi, Firefox serializza le 2 richieste per lo stesso URI. Apri 2 diversi browser contemporaneamente (ad es. IE e Firefox), richiedi http://localhost/ in entrambi e otterrai il risultato previsto.

E la risposta alla tua domanda: Sì, ovviamente, ogni evento TIdHTTPServer.OnCommandGet viene eseguito in un proprio thread "scheduler" e può essere eseguito contemporaneamente.

+2

Sì, è così! Ho usato Firefox e Internet Explorer, e ho ottenuto i risultati attesi, grazie mille! C'era un bug nel mio codice che mostrava lo stesso comportamento, quindi quando ho visto Firefox farlo anche io ho pensato che il mio codice fosse perfetto ... –

0

Ho usato Indy 10 idHTTPServer ed è è multithread. Quale blocco della tua app potrebbe essere il "beep" o il comando "sleep". Perché sebbene il componente sia multithread, alcuni comandi potrebbero comunque bloccare l'intero processo.

+0

Per qualche motivo, Indy sta aspettando che la prima richiesta venga completata prima di attivare OnCommandGet per la seconda richiesta. È come se avesse avvolto il metodo OnCommandGet in una sezione critica. Potrebbe essere utilizzare thread diversi per ogni richiesta, ma ciò non serve a niente se Indy li licenzia ancora in serie. Le funzioni Beep e Sleep non bloccano alcun altro thread. –

+0

Da quando ho sviluppato un'applicazione completa con il componente sono quasi certo che sia multithread. Se non sarà un problema inserisci il tuo codice e esaminiamolo insieme per trovare il problema;) – BYK

+1

Grazie, prova il codice da questo link, fammi sapere cosa vedi: http://www.benziegler.com/ stuff/IndyTest.zip –