Question

J'utilise le composant TIdCmdTCPServer d'Indy 10 pour réaliser mon application client-serveur. Le problème est que la demande des clients peut être assez complexe et que la partie de l'interface graphique de mon application serveur perd immédiatement la réactivité. De Indy Documentation , je suis arrivé que Indy:

  

Crée et démarre des fils d'écoute pour les liaisons utilisant le tpHighest prioritaire de fil.

Puis-je changer ce comportement?

Était-ce utile?

La solution

Rob a fait remarquer, ne changent pas la priorité du thread d'écoute, abaisser la priorité des threads de travail à la place. Il peut être consulté dans la section OnConnect () gestionnaire de TIdCmdTCPServer par exemple, comme suit:

procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
  // sanity checks need to go here
  TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;

Autres conseils

Réglage de la priorité inférieure pour le fil d'écoute ne résoudra pas votre problème. Tout le fil d'écouteur est en train de faire est à l'écoute, ce qui est une tâche CPU-intensive. Jusqu'à ce qu'une connexion arrive, que le fil ne fait rien du tout. Vous pouvez être en mesure de confirmer que, avec un outil comme Process Explorer; Je pense qu'il peut montrer l'utilisation du processeur par fil.

Réglage de la priorité inférieure peut réellement faire votre serveur apparaissent moins sensibles parce que quand une connexion arrive, le fil d'écoute pour cette connexion fonctionnera avec une priorité inférieure et ne sera pas en mesure de travailler sur la connexion immédiatement. Le client devra attendre un peu plus longtemps avant que votre serveur démarre le traitement de sa demande.

Les demandes ne sont pas traitées dans le fil d'écouteur. Les délégués de fil d'écoute la plupart des travaux à d'autres fils. Si vous avez juste une liaison de TCP, alors vous aurez un seul thread d'écoute, mais vous pouvez traiter de nombreuses connexions simultanées. Chaque connexion sera assurée par un thread séparé bien qu'il n'y ait qu'un seul auditeur.

Quoi qu'il en soit, vous pouvez changer la priorité en traitant l'événement OnBeforeListenerRun de l'objet serveur. Il reçoit une référence à la TIdThread qui représente le thread d'écoute, de sorte que vous pouvez attribuer une valeur différente à sa propriété Priority. En outre, vous avez le code source, donc vous pouvez aller et changer la définition de la constante de tpListener dans IdGlobalCore.pas . Le code utilise cette valeur, pas tpHighest directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top