TsgcWebSocketServer › Gebeurtenissen › OnQueueDrained
Wordt geactiveerd wanneer de uitgaande wachtrij van een clientverbinding van gevuld naar leeg overgaat.
property OnQueueDrained: TsgcWSQueueDrainedEvent;
// TsgcWSQueueDrainedEvent = procedure(Connection: TsgcWSConnection) of object
—
Wordt alleen geactiveerd wanneer berichtwachtrijen actief zijn voor de betrokken verbinding, dat wil zeggen wanneer QueueOptions.Text.Level, QueueOptions.Binary.Level of QueueOptions.Ping.Level is ingesteld op iets anders dan qmNone. Zonder wachtrij valt er niets te legen en wordt de gebeurtenis nooit gegenereerd.
De handler wordt inline uitgevoerd op de verbindingsthread en wordt bewust niet via NotifyEvents gemarshald, anders dan elke andere gebeurtenis van dit component, dus de handler mag de gebruikersinterface niet aanraken. Die afwijking is opzettelijk. De hele waarde van de gebeurtenis is dat ze precies op dat punt van de verbindingslus wordt uitgevoerd, direct nadat de wachtrij is geleegd en vóór de volgende leesbewerking, terwijl de socket nog inactief is, zodat de toepassing het volgende krediet kan uitgeven zonder te wachten. Marshallen naar de hoofdthread zou dat tenietdoen. Elke bijwerking van een formulier, raster of label moet door de toepassing zelf worden gemarshald, met TThread.Queue, TThread.Synchronize of een bericht dat naar de hoofdthread wordt gepost.
Uitzonderingen die binnen de handler worden gegenereerd, worden opgevangen en verworpen zodat het legen altijd wordt voltooid. Een handler die faalt, doet dat stil. Plaats de body daarom in een eigen try..except-blok wanneer een fout moet worden gemeld.
De gebeurtenis wordt eenmaal per overgang van niet-leeg naar leeg geactiveerd, niet eenmaal per doorloop van de verbindingslus. Het is geen signaal dat een burst is afgelopen. Als het legen gelijke tred houdt met een trage producent, kan elk afzonderlijk bericht zijn eigen gebeurtenis genereren, omdat elk bericht wordt weggeschreven voordat het volgende in de wachtrij wordt geplaatst. Wat de gebeurtenis meldt, is dat de wachtrij voor deze verbinding op dit moment leeg is, meer niet.
Het typische gebruik is stroombesturing. Wanneer de server bulkgegevens tussen clients doorgeeft, gebruikt u de gebeurtenis om een verzendende client te melden dat die meer mag verzenden. Combineer haar met de eigenschap PendingCount van TsgcWSConnection, die aangeeft hoeveel berichten nog in de wachtrij staan voor die verbinding, om een kredietvenster te gebruiken in plaats van een stop-en-wacht-uitwisseling.
De beheerde .NET-port genereert dezelfde gebeurtenis met dezelfde betekenis. Het enige verschil is hoe vaak ze binnenkomt. Het legen in Delphi gebeurt eenmaal per doorloop van de verbindingslus, met tussenpozen van Options.ReadTimeOut milliseconden en standaard 10, zodat een traag druppelende stroom berichten tot weinig gebeurtenissen wordt samengevoegd. Het beheerde legen is gebeurtenisgestuurd en dezelfde druppelstroom kan meer gebeurtenissen genereren. Bursts gedragen zich op beide identiek.
procedure OnQueueDrained(Connection: TsgcWSConnection);
begin
// runs on the connection thread, do not touch the user interface here
Connection.WriteData('credit 64');
end;