TsgcWebSocketHTTPServer › Properties › QueueOptions
Sérialise les messages sortants via une file d'attente interne par connexion pour éviter les conflits entre les threads.
property QueueOptions: TsgcWSQueueServer_Options read FQueueOptions write SetQueueOptions;
Text.Level=qmNone, Binary.Level=qmNone, Ping.Level=qmNone, DrainedMode=qdmTransition
Lorsqu'il est activé, les messages sont placés dans une file d'attente interne et envoyés dans le contexte du thread de connexion au lieu du thread de l'appelant. Cela supprime le verrouillage nécessaire lorsque plusieurs threads écrivent simultanément sur la même connexion. Chaque type de message (Text, Binary, Ping) est un sous-objet doté de sa propre propriété Level, qui lui attribue une priorité indépendante : qmNone ignore la file d'attente (par défaut), qmLevel0 est traité en premier, puis qmLevel1 et enfin qmLevel2. Par exemple, définir Text.Level et Binary.Level à qmLevel2 et Ping.Level à qmLevel1 garantit que les pings sont livrés avant le trafic ordinaire. QueueOptions n'est pris en charge que par l'IOHandler par défaut. Lorsque IOHandlerOptions.IOHandlerType vaut iohIOCP ou iohEPOLL, la file d'attente est désactivée au démarrage du serveur : les trois niveaux sont réinitialisés à qmNone, l'événement OnError le signale et les messages sont écrits en ligne sur le thread appelant. Un niveau attribué alors que le serveur est déjà en écoute est réinitialisé de la même manière à chaque nouvelle connexion.
DrainedMode sélectionne le moment où l'événement OnQueueDrained est déclenché. Avec qdmTransition (par défaut), l'événement se déclenche une fois chaque fois que la file d'attente sortante d'une connexion passe de l'état contenant des messages à l'état vide. Avec qdmEveryPass, il se déclenche à chaque passage de la boucle de connexion, juste après l'envoi des files d'attente, même si la file était déjà vide et même si Text.Level, Binary.Level et Ping.Level valent tous qmNone, de sorte qu'aucun niveau de file factice n'est nécessaire. C'est utile comme crochet par connexion exécuté sur le thread propre de la connexion, par exemple pour envoyer des données applicatives en attente avec WriteData. L'événement ne suit pas NotifyEvents, le gestionnaire doit donc être rapide et ne pas toucher à l'interface utilisateur. Seul l'IOHandler par défaut possède cette boucle, avec iohIOCP et iohEPOLL l'événement n'est jamais déclenché par passage. Chaque connexion copie les options de file d'attente lors de sa connexion, définissez donc DrainedMode avant d'activer le composant, les connexions déjà ouvertes conservent le mode précédent.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.QueueOptions.Text.Level := qmLevel2;
oServer.QueueOptions.Binary.Level := qmLevel2;
oServer.QueueOptions.Ping.Level := qmLevel1;
oServer.Active := true;