2010-12-15 86 views
25

J'ai un programme de console qui a des composants qui exécutent comme ceci:de Windows Application console Mise en Collé (besoins de presse Key)

void start() { 
while(true){ 
    DoSomething(); 
    Thread.Sleep(1000*5); 
} 
} 

Mon principal point d'entrée ressemble [code pseudo-ish]

Thread.Start(Componenet1.Start); 
Thread.Start(Componenet2.Start); 

while(true){ 
    Console.Writeline("running"); 
    Thread.Sleep(1000*5); 
} 

Il n'y a aucun Console.Reads n'importe où. Mon problème est PARFOIS l'application fonctionnera bien mais s'arrêtera et si j'appuie sur n'importe quelle clef sur la fenêtre elle commencera à fonctionner encore. Cela arrive assez rarement, mais j'ai ce programme déployé sur 100+ VM fonctionnant 24/7 dans un environnement automatisé.

Toujours sur l'ordinateur, j'ai des scripts AHK et d'autres choses qui manipulent la souris mais je ne sais pas si cela a quelque chose à voir avec ça.

Notez également que parfois le CPU peut vraiment fonctionner à 100% sur les machines alors peut-être que la priorité des threads est un problème?

SOLUTION: Vous devez désactiver le mode d'édition rapide. Ici travaille code C# pour ce faire:

// http://msdn.microsoft.com/en-us/library/ms686033(VS.85).aspx 
    [DllImport("kernel32.dll")] 
    public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); 

    private const uint ENABLE_EXTENDED_FLAGS = 0x0080; 

    static void Main(string[] args) 
    { 
     IntPtr handle = Process.GetCurrentProcess().MainWindowHandle; 
     SetConsoleMode(handle, ENABLE_EXTENDED_FLAGS); 
+0

essayer de commenter 'DoSomething();' et voir si elle se comporte de la même manière – Andrey

+0

La réponse dans le code C# ne semble pas fonctionner. La réponse ci-dessous acceptée. – liang

+0

Le code C# ne fonctionne pas pour moi. Une solution de travail peut être trouvée ici: https://stackoverflow.com/a/36720802/1999917 –

Répondre

33

Si l'utilisateur clique accidentellement dans la fenêtre de la console noire, le curseur à un rectangle blanc rempli, et l'application se bloque à l'instruction suivante Console.Write, jusqu'à ce qu'une autre clic est fait.

Il s'agit d'une fonctionnalité générique de la fenêtre de la console lorsque son "QuickEdit Mode" est activé. Pour désactiver cette fonctionnalité, vous devez décocher l'option "QuickEdit Mode" de la fenêtre de console de votre application au moment de l'exécution.

+0

aaaaaaah, je pense que j'ai remarqué le changement de curseur. Je vais essayer de confirmer cela quand cela arrivera. –

+0

@nextgenneo: Si c'est le cas, vous pouvez le désactiver par programmation: http://bytes.com/topic/visual-basic-net/answers/366818-console-writeline-hangs-if-user-click-into-console- fenêtre – LaGrandMere

+0

ouais, super. confirmé c'était le problème! –