TsgcWebSocketServer › Eventos › OnQueueDrained

OnQueueDrained Evento

Se dispara cuando la cola de salida de una conexión de cliente pasa de contener mensajes a estar vacía.

Sintaxis

property OnQueueDrained: TsgcWSQueueDrainedEvent;
// TsgcWSQueueDrainedEvent = procedure(Connection: TsgcWSConnection) of object

Valor Predeterminado

—

Observaciones

Solo se dispara cuando la cola de mensajes está activa para la conexión afectada, es decir, cuando QueueOptions.Text.Level, QueueOptions.Binary.Level o QueueOptions.Ping.Level tiene un valor distinto de qmNone. Sin cola no hay nada que vaciar y el evento nunca se produce.

El manejador se ejecuta en línea en el hilo de conexión y deliberadamente no se transfiere al hilo principal a través de NotifyEvents, a diferencia de todos los demás eventos de este componente, por lo que no debe tocar la interfaz de usuario. La desviación es intencionada. Todo el valor del evento reside en que se ejecuta en ese punto exacto del bucle de conexión, justo después de que la cola se haya vaciado y antes de la siguiente lectura, mientras el socket sigue inactivo, de modo que la aplicación puede entregar el siguiente crédito sin esperar. Transferirlo al hilo principal destruiría esa ventaja. Cualquier actualización de un formulario, una rejilla o una etiqueta debe transferirla la propia aplicación, con TThread.Queue, TThread.Synchronize o un mensaje enviado al hilo principal.

Las excepciones lanzadas dentro del manejador se capturan y se descartan para que el vaciado siempre se complete. Un manejador que falla lo hace de forma silenciosa, así que envuelva el cuerpo en su propio bloque try..except cuando sea necesario informar de un fallo.

El evento se dispara una vez por cada transición de no vacía a vacía, no una vez por cada pasada del bucle de conexión. No es una señal de que una ráfaga haya terminado. Si el vaciado sigue el ritmo de un productor lento, cada mensaje puede generar su propio evento, porque cada mensaje se escribe antes de que se encole el siguiente. Lo que el evento indica es que la cola de esta conexión está vacía en este momento, nada más.

El uso habitual es el control de flujo. Cuando el servidor retransmite datos masivos entre clientes, utilice el evento para indicar a un cliente emisor que ya puede enviar más. Combínelo con la propiedad PendingCount de TsgcWSConnection, que informa de cuántos mensajes siguen encolados para esa conexión, para gestionar una ventana de créditos en lugar de un intercambio de parada y espera.

La implementación gestionada de .NET genera el mismo evento con el mismo significado. La única diferencia es la frecuencia con la que llega. El vaciado de Delphi se ejecuta una vez por cada pasada del bucle de conexión, que están separadas por Options.ReadTimeOut milisegundos, 10 de forma predeterminada, por lo que un goteo lento de mensajes se agrupa en pocos eventos. El vaciado gestionado se basa en eventos y ese mismo goteo puede generar más eventos. Las ráfagas se comportan igual en ambos.

Ejemplo


procedure OnQueueDrained(Connection: TsgcWSConnection);
begin
  // runs on the connection thread, do not touch the user interface here
  Connection.WriteData('credit 64');
end;

Volver a Eventos