Maison  >  Article  >  développement back-end  >  Comment puis-je implémenter une saisie console non bloquante en C pour des applications interactives et efficaces ?

Comment puis-je implémenter une saisie console non bloquante en C pour des applications interactives et efficaces ?

DDD
DDDoriginal
2024-10-29 19:50:03728parcourir

How can I implement non-blocking console input in C   for interactive and efficient applications?

Entrée console non bloquante en C : une solution polyvalente

Dans le domaine de la programmation C, la possibilité de gérer une console non bloquante la saisie est cruciale, en particulier lors de la création d'applications qui nécessitent une interaction continue de l'utilisateur, même lors de l'exécution de tâches chronophages. Cet article présente une solution complète utilisant des techniques C modernes et des bibliothèques externes, tirant parti d'une licence permissive pour une flexibilité améliorée.

Approches et considérations

C propose plusieurs approches pour obtenir des résultats non -bloquer l'entrée de la console, chacun avec ses propres avantages et considérations :

  • Modèle de thread C 11 :Cette approche exploite les bibliothèques std::thread et std::future pour créer un thread séparé qui gère les entrées de l'utilisateur indépendamment de l'exécution du programme principal, permettant un traitement simultané.
  • Boost.Asio : Cette bibliothèque externe fournit un puissant cadre de mise en réseau et d'E/S de bas niveau, y compris des fonctionnalités pour une entrée de console non bloquante.
  • ncurses : Une bibliothèque largement utilisée spécialisée dans le contrôle des terminaux et la gestion des entrées, offrant un riche ensemble de fonctions pour une entrée de console non bloquante et des fonctionnalités avancées gestion du terminal.

Le choix de l'approche dépend des besoins spécifiques et des préférences du programmeur. Pour une solution plus simple et plus directe, le modèle de thread C 11 est une option appropriée.

Exemple : Implémentation d'une entrée de console non bloquante avec C 11

Le code suivant L'extrait montre une entrée de console non bloquante à l'aide du modèle de thread C 11 :

<code class="cpp">#include <iostream>
#include <future>
#include <thread>
#include <chrono>

static std::string getAnswer()
{
    std::string answer;
    std::cin >> answer;
    return answer;
}

int main()
{
    std::chrono::seconds timeout(5);
    std::cout << "Do you even lift?" << std::endl << std::flush;
    std::string answer = "maybe"; //default to maybe
    std::future<std::string> future = std::async(getAnswer);
    if (future.wait_for(timeout) == std::future_status::ready)
        answer = future.get();

    std::cout << "the answer was: " << answer << std::endl;
    exit(0);
}</code>

Dans cet exemple :

  • La fonction getAnswer lit les entrées de l'utilisateur de manière non bloquante à l'aide de std : cin stream.
  • Le thread principal crée un thread séparé en utilisant std::async pour exécuter la fonction getAnswer.
  • Le thread principal continue de s'exécuter et demande à l'utilisateur une entrée.
  • Si l'utilisateur fournit une entrée dans les 5 secondes (spécifiées par la variable timeout), le thread principal récupère l'entrée du futur et la génère. Sinon, la valeur par défaut « peut-être » est utilisée.

Conclusion

Le paradigme de saisie de console non bloquant permet aux programmeurs C de développer des applications interactives qui gèrent de manière transparente commandes utilisateur et effectuer des tâches en arrière-plan simultanément. Les approches proposées offrent différents niveaux de complexité et de fonctionnalités, permettant aux programmeurs de sélectionner la solution la mieux adaptée à leurs besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn