TsgcWebSocketHTTPServer › Propiedades › QueueOptions

QueueOptions Propiedad

Serializa los mensajes salientes mediante una cola interna por conexión para evitar la contención entre hilos.

Sintaxis

property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;

Valor Predeterminado

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

Observaciones

Cuando está habilitado, los mensajes se colocan en una cola interna y se envían en el contexto del hilo de conexión en lugar del hilo del invocador; esto elimina el bloqueo necesario cuando varios hilos escriben simultáneamente en la misma conexión. Cada tipo de mensaje (Text, Binary, Ping) es un subobjeto con su propia propiedad Level, que asigna una prioridad independiente: qmNone omite la cola (valor predeterminado), qmLevel0 se procesa primero, luego qmLevel1 y finalmente qmLevel2. Por ejemplo, configurar Text.Level y Binary.Level en qmLevel2 y Ping.Level en qmLevel1 garantiza que los pings se entreguen antes que el tráfico ordinario. QueueOptions solo es compatible con el IOHandler predeterminado. Cuando IOHandlerOptions.IOHandlerType es iohIOCP o iohEPOLL, la cola se desactiva al iniciarse el servidor: los tres niveles se restablecen a qmNone, el evento OnError lo notifica y los mensajes se escriben en línea en el hilo del invocador. Un nivel asignado cuando el servidor ya está escuchando se restablece del mismo modo en cada nueva conexión.

DrainedMode selecciona cuándo se produce el evento OnQueueDrained. Con qdmTransition (valor predeterminado) el evento se dispara una vez cada vez que la cola saliente de una conexión pasa de contener mensajes a estar vacía. Con qdmEveryPass se dispara en cada pasada del bucle de conexión, justo después de enviar las colas, incluso cuando la cola ya estaba vacía e incluso cuando Text.Level, Binary.Level y Ping.Level son todos qmNone, de modo que no hace falta un nivel de cola ficticio. Resulta útil como gancho por conexión que se ejecuta en el propio hilo de la conexión, por ejemplo para enviar datos pendientes de la aplicación con WriteData. El evento no sigue a NotifyEvents, por lo que el manejador debe ser rápido y no debe tocar la interfaz de usuario. Solo el IOHandler predeterminado tiene este bucle; con iohIOCP y iohEPOLL el evento nunca se produce por pasada. Cada conexión copia las opciones de la cola al conectarse, así que configure DrainedMode antes de activar el componente; las conexiones ya abiertas conservan el modo anterior.

Ejemplo


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

Volver a Propiedades