J'implémente un éditeur de texte Win32 Console qui a une file d'attente interne pour transmettre des informations sur les zones à redessiner, les messages de/vers les plugins, etc. Je préfère qu'il soit mono-threadé par défaut (s'il ne se passe rien cela nécessite des threads supplémentaires). J'envisage 2 stratégies de message de mise en œuvre de la file d'attente:Est-il acceptable pour un éditeur de texte de transmettre chaque touche d'un thread à un autre?
- Utiliser la file d'usage général et Win32 événement, donc je peux utiliser
WaitForMultipleObjectsEx
attendre pour les messages internes et l'entrée d'utilisateur en même temps, passant à la fois la poignée d'entrée de la console et la poignée de l'événement. Dans ce cas, l'éditeur de texte peut vivre entièrement dans un seul thread. - Utiliser le port d'achèvement d'E/S. Dans ce cas, l'éditeur de texte aura besoin d'au moins deux threads, l'un appelant
GetQueuedCompletionStatus
pour recevoir des messages, et un autre lisant l'entrée de l'utilisateur et l'envoyant en file d'attente viaPostQueuedCompletionStatus
. La raison pour laquelle le handle d'entrée de la console ne peut pas se chevaucher et les fonctionsWaitFor*
n'acceptent pas le port d'achèvement comme un handle attendu, il n'est donc pas possible de les attendre simultanément. Tout comme dans la première configuration, les deux threads ne perdent pas de temps CPU lorsqu'il n'y a pas d'entrées ou d'événements, mais chaque pression de touche doit être transmise d'un thread à l'autre via IOCP.
Quelle est la meilleure conception?
L'inconvénient de performance et de latence est-il dû au passage de chaque pression de touche via IOCP significatif pour un éditeur de texte?
Je ne connais pas Windows, mais vous avez très peu de touches toutes les secondes. Les ordinateurs sont rapides. –
Même si les threads n'attendent que le mode kernel, vous perdez encore de la mémoire si vous avez des threads inutiles. – Anders
Avez-vous envisagé d'utiliser une boîte à outils multiplateforme comme [Qt] (http://qt.io)? Ensuite, vous ferez ce que cette boîte à outils fournit –