TsgcWebSocketHTTPServer › Eigenschappen › QueueOptions

QueueOptions Eigenschap

Serialiseert uitgaande berichten via een interne wachtrij per verbinding om contentie tussen threads te voorkomen.

Syntaxis

property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;

Standaardwaarde

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

Opmerkingen

Wanneer ingeschakeld, worden berichten in een interne wachtrij geplaatst en verzonden vanuit de verbindingsthread in plaats van de thread van de aanroeper. Hierdoor is geen vergrendeling nodig wanneer meerdere threads tegelijkertijd naar dezelfde verbinding schrijven. Elk berichttype (Text, Binary, Ping) is een subobject met een eigen eigenschap Level, die een onafhankelijke prioriteit toekent: qmNone slaat de wachtrij over (standaard), qmLevel0 wordt als eerste verwerkt, daarna qmLevel1 en tot slot qmLevel2. Door Text.Level en Binary.Level op qmLevel2 en Ping.Level op qmLevel1 in te stellen, is gegarandeerd dat pings vóór gewoon verkeer worden afgeleverd. QueueOptions wordt alleen ondersteund door de standaard-IOHandler. Wanneer IOHandlerOptions.IOHandlerType gelijk is aan iohIOCP of iohEPOLL, wordt de wachtrij uitgeschakeld zodra de server start: de drie niveaus worden teruggezet op qmNone, de gebeurtenis OnError meldt dit en berichten worden inline op de aanroepende thread geschreven. Een niveau dat wordt toegewezen nadat de server al luistert, wordt op dezelfde manier teruggezet bij elke nieuwe verbinding.

DrainedMode bepaalt wanneer de gebeurtenis OnQueueDrained wordt gegenereerd. Met qdmTransition (standaard) wordt de gebeurtenis eenmaal geactiveerd telkens wanneer de uitgaande wachtrij van een verbinding van berichten bevattend naar leeg gaat. Met qdmEveryPass wordt ze geactiveerd bij elke doorloop van de verbindingslus, direct nadat de wachtrijen zijn verzonden, ook wanneer de wachtrij al leeg was en ook wanneer Text.Level, Binary.Level en Ping.Level allemaal qmNone zijn, zodat er geen dummy-wachtrijniveau nodig is. Dit is nuttig als hook per verbinding die op de eigen thread van de verbinding wordt uitgevoerd, bijvoorbeeld om openstaande toepassingsgegevens te verzenden met WriteData. De gebeurtenis volgt NotifyEvents niet, dus de handler moet snel zijn en mag de gebruikersinterface niet aanraken. Alleen de standaard IOHandler heeft deze lus, met iohIOCP en iohEPOLL wordt de gebeurtenis nooit per doorloop gegenereerd. Elke verbinding kopieert de wachtrijopties wanneer ze verbinding maakt, dus stel DrainedMode in voordat u het component activeert, reeds geopende verbindingen behouden de vorige modus.

Voorbeeld


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

Terug naar Properties