Comment et pourquoi le mode QuickEdit dans Invite de commandes gèle-t-il les applications?

J’ai récemment rencontré un problème avec l’invite de commande sous Windows où le mode QuickEdit était activé et le fait de cliquer sur la fenêtre sélectionnait du texte et suspendait un programme en cours d’exécution. C’est, apparemment, un comportement connu – j’ai trouvé quelques questions à ce sujet:

  • Ligne de commande Windows en suspension dans Windows RDP
  • Application de la console Windows bloquée
  • Comment désactiver le mode QuickEdit pour des scripts individuels

Comment l’application est-elle “suspendue” / “suspendue”? Le processus est-il similaire au signal SIGSTOP sur * nix? (Je suis également intéressé à comprendre pourquoi cette fonctionnalité existe en premier lieu? Elle semble peu intuitive et dangereuse.)

C’est beaucoup par conception. Il n’ya pas de moyen raisonnable pour un utilisateur de sélectionner du texte lorsque votre programme continue à faire défiler le contenu de la fenêtre de la console. Ainsi, le programme hôte de la console arrête simplement de lire votre sortie stdout / stderr et votre programme se bloque jusqu’à ce que l’utilisateur termine l’opération. Cela peut être changé, vous devrez appeler Get + SetConsoleMode () et désactiver l’option ENABLE_QUICK_EDIT_MODE.

Notez que ce “blocage” n’est pas fondamentalement différent des pauses d’exécution que vous obtenez lorsque votre programme génère une sortie stdout à un taux beaucoup plus élevé que celui que l’hôte de la console peut consumr. Bien que ces délais soient limités.

Et ce n’est pas la seule façon pour l’utilisateur d’arrêter votre programme, il peut aussi simplement appuyer sur Ctrl + S. Appuyez sur Ctrl + Q pour le reprendre. Si vous êtes assez vieux, vous pourriez reconnaître ces codes de contrôle comme Xon / Xoff , caractères de prise de contact pour un terminal. C’est ce que la console est vraiment, une simple émulation de terminal telle qu’elle était utilisée dans les années 1970. Cela peut aussi être changé, vous devrez cesser de vous fier à l’entrée de la console intégrée et passer à ReadConsole () . Ou en désactivant l’option de la console ENABLE_LINE_INPUT, vous n’êtes pas sûr des effets secondaires puisque vous n’avez mentionné aucun langage, vous devrez essayer.

Et bien sûr, il est très facile de mettre fin à votre programme. Vous obtenez EOF sur stdin lorsque l’utilisateur tape Ctrl + Z, cela devrait mettre fin à votre programme. Et il y a Ctrl + C et Ctrl + Break pour une terminaison instantanée, quel que soit le programme. Vous pouvez recevoir une notification avec SetConsoleCtrlHandler () mais vous ne pouvez pas la bloquer.

Si le comportement par défaut est dangereux et risque de nuire à la santé d’un être humain, je vous suggère fortement d’engager un consultant. Et ne saura pas qui a écrit cette réponse.

J’ai eu beaucoup de mal à découvrir pourquoi mon application C # ne répondait pas avant que je appuie sur une touche! Pour ceux qui ont besoin d’une désactivation programmatique de QuickEdit, regardez ici .