TsgcWebSocketHTTPServer › Propriedades › QueueOptions
Serializa as mensagens de saída através de uma fila interna por conexão para evitar contenção entre threads.
property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;
Text.Level=qmNone, Binary.Level=qmNone, Ping.Level=qmNone, DrainedMode=qdmTransition
Quando habilitado, as mensagens são colocadas em uma fila interna e enviadas no contexto da thread da conexão em vez da thread do chamador. Isso elimina o bloqueio necessário quando várias threads escrevem na mesma conexão simultaneamente. Cada tipo de mensagem (Text, Binary, Ping) é um subobjeto com sua própria propriedade Level, que atribui uma prioridade independente: qmNone ignora a fila (padrão), qmLevel0 é processado primeiro, depois qmLevel1 e por fim qmLevel2. Por exemplo, definir Text.Level e Binary.Level como qmLevel2 e Ping.Level como qmLevel1 garante que os pings sejam entregues antes do tráfego comum. QueueOptions é suportado apenas pelo IOHandler padrão. Quando IOHandlerOptions.IOHandlerType é iohIOCP ou iohEPOLL, a fila é desativada assim que o servidor inicia: os três níveis são redefinidos para qmNone, o evento OnError informa isso e as mensagens são gravadas em linha na thread do chamador. Um nível atribuído depois que o servidor já está escutando é redefinido da mesma forma em cada nova conexão.
DrainedMode seleciona quando o evento OnQueueDrained é disparado. Com qdmTransition (padrão), o evento é disparado uma vez cada vez que a fila de saída de uma conexão passa de conter mensagens para ficar vazia. Com qdmEveryPass, ele é disparado a cada passagem do laço da conexão, logo após o envio das filas, mesmo quando a fila já estava vazia e mesmo quando Text.Level, Binary.Level e Ping.Level são todos qmNone, de modo que não é necessário um nível de fila fictício. É útil como um gancho por conexão executado na própria thread da conexão, por exemplo para enviar dados pendentes da aplicação com WriteData. O evento não segue NotifyEvents, portanto o manipulador deve ser rápido e não deve tocar na interface do usuário. Somente o IOHandler padrão possui esse laço; com iohIOCP e iohEPOLL o evento nunca é disparado por passagem. Cada conexão copia as opções da fila quando se conecta, portanto defina DrainedMode antes de ativar o componente; as conexões já abertas mantêm o modo anterior.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.QueueOptions.Text.Level := qmLevel2;
oServer.QueueOptions.Binary.Level := qmLevel2;
oServer.QueueOptions.Ping.Level := qmLevel1;
oServer.Active := true;