TsgcWebSocketHTTPServer › Proprietà › QueueOptions

QueueOptions Property

Serializza i messaggi in uscita tramite una coda interna per connessione per prevenire la contesa tra thread.

Sintassi

property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;

Valore predefinito

Text.Level=qmNone, Binary.Level=qmNone, Ping.Level=qmNone, DrainedMode=qdmTransition

Note

Quando abilitato, i messaggi vengono collocati in una coda interna e inviati nel contesto del thread della connessione anziché nel thread del chiamante. Questo elimina il blocco necessario quando più thread scrivono sulla stessa connessione contemporaneamente. Ogni tipo di messaggio (Text, Binary, Ping) è un sotto-oggetto con una propria proprietà Level, che assegna una priorità indipendente: qmNone salta la coda (predefinito), qmLevel0 viene elaborato per primo, poi qmLevel1 e infine qmLevel2. Ad esempio, impostare Text.Level e Binary.Level su qmLevel2 e Ping.Level su qmLevel1 garantisce che i ping vengano consegnati prima del traffico ordinario. QueueOptions è supportato solo dall'IOHandler predefinito. Quando IOHandlerOptions.IOHandlerType è iohIOCP o iohEPOLL, la coda viene disattivata all'avvio del server: i tre livelli vengono reimpostati su qmNone, l'evento OnError lo segnala e i messaggi vengono scritti inline sul thread del chiamante. Un livello assegnato quando il server è già in ascolto viene reimpostato allo stesso modo a ogni nuova connessione.

DrainedMode seleziona quando viene generato l'evento OnQueueDrained. Con qdmTransition (predefinito) l'evento si attiva una sola volta ogni volta che la coda in uscita di una connessione passa dal contenere messaggi all'essere vuota. Con qdmEveryPass si attiva a ogni passaggio del ciclo della connessione, subito dopo l'invio delle code, anche quando la coda era già vuota e anche quando Text.Level, Binary.Level e Ping.Level sono tutti qmNone, quindi non serve alcun livello di coda fittizio. È utile come hook per connessione eseguito sul thread proprio della connessione, ad esempio per inviare dati applicativi in sospeso con WriteData. L'evento non segue NotifyEvents, quindi il gestore deve essere veloce e non deve toccare l'interfaccia utente. Solo l'IOHandler predefinito dispone di questo ciclo: con iohIOCP e iohEPOLL l'evento non viene mai generato a ogni passaggio. Ogni connessione copia le opzioni della coda quando si connette, quindi impostare DrainedMode prima di attivare il componente: le connessioni già aperte mantengono la modalità precedente.

Esempio


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.QueueOptions.Text.Level := qmLevel2;
oServer.QueueOptions.Binary.Level := qmLevel2;
oServer.QueueOptions.Ping.Level := qmLevel1;
oServer.Active := true;

Torna alle Proprietà