2010-08-10 5 views
0

J'ai intégré une fenêtre de console dans mon formulaire d'application Windows en utilisant С #C# problème de la fenêtre de la console avec _getch()

J'ai une application qui fonctionne dans la fenêtre de la console. mon projet C# est une interface graphique pour afficher la sortie de ceci et aussi pour lui envoyer des paramètres.

La plupart fonctionnent correctement, sauf quand un appel à _getch() est fait à partir de mon interface graphique vers la fenêtre de la console, il a tendance à geler tout le système.

Quelqu'un at-il eu des idées pour lesquelles cela se produirait?

Je peux afficher un code si nécessaire.

Merci vous

Répondre

0

La fonction _getch() ne retournera pas jusqu'à ce que l'utilisateur appuie sur une touche de frappe sur le clavier. Si cette fonction est appelée à partir du thread principal de votre programme, cela bloquera le thread de l'interface utilisateur. Il ne va pas pomper la boucle de message, votre interface utilisateur se fige quand il ne traite plus les événements d'entrée, ni peint les fenêtres. Après quelques secondes Windows met la fenêtre fantôme en place avec "Ne répond pas" dans la barre de titre.

Alors que l'appel à _getch() à partir d'un thread d'arrière-plan résoudra le problème, cela ne sera probablement pas pratique. Vous pouvez utiliser _kbhit() pour vérifier si une séquence de touches est disponible. Appeler _getch() après que _kbhit() renvoie true ne bloquera pas. Probablement pas pratique non plus. Essayer de pomper la boucle de message alors que _kbhit() renvoie false serait techniquement une solution, si ce n'était pas pour la boucle de message vivant dans le mauvais code.

Notez que vous pouvez taper Ctrl + S dans la fenêtre de la console pour suspendre la sortie, Ctrl + Q le reprend à nouveau. Vous allez toujours bloquer le fil de l'interface utilisateur, mais au moins vous le ferez sciemment.

+0

excellent morceau d'info là Hans Passant, je vous remercie gentiment pour la réponse :) – SnoopFroggyFrog

2

Les chances sont que _getch() est un appel de blocage.

+0

savez-vous comment je pourrais surmonter cela à partir d'un formulaire de demande de Windows? – SnoopFroggyFrog

0

Que fait _getch()? Vous pouvez démarrer l'appel dans un autre thread s'il bloque le thread de l'interface utilisateur.

+0

_getch() lit une séquence de touches dans l'invite de commande. Le problème est, j'ai un programme que j'ai écrit pour une utilisation avec l'invite de commande. Cela fonctionne à 100%. mais lorsque j'essaie de l'utiliser via mon interface graphique conçue dans Visual Studio en intégrant l'invite de commande dans l'application de formulaire Windows. ça pend, mais toutes les autres fonctions fonctionnent. donc des idées comment je pourrais gérer cela à partir de mon interface graphique? – SnoopFroggyFrog

Questions connexes