2010-12-15 15 views
25

ich ein Konsolenprogramm habe, die verschiedenen Komponenten hat, die wie folgt ausgeführt werden:Windows-Konsole-Anwendung zu (Benötigt Key Press)

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

Mein Haupteinstiegspunkt sieht aus wie [pseudo-ish Code]

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

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

Es gibt keine Console.Reads überall. Mein Problem ist manchmal die Anwendung wird gut laufen, aber dann aufhören und wenn ich eine beliebige Taste auf dem Fenster drücken wird es wieder funktionieren. Dies passiert ziemlich selten, aber ich habe dieses Programm auf 100+ VMs installiert, die 24/7 in einer automatisierten Umgebung laufen.

Auch auf dem Computer habe ich einige AHK-Skripte und andere Sachen, die die Maus manipulieren, aber nicht sicher, ob das etwas damit zu tun hat.

Beachten Sie auch, dass manchmal die CPU wirklich auf den Maschinen zu 100% ausgeführt werden kann, vielleicht Thread-Priorität ein Problem ist?

LÖSUNG: Sie müssen den Schnellbearbeitungsmodus deaktivieren. Hier arbeitet C# -Code, dies zu tun:

// 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

versuchen, 'DoSomething();' kommentieren und sehen, ob es sich gleich verhält – Andrey

+0

Die Antwort in C# Code scheint nicht zu funktionieren. Die unten akzeptierte Antwort tut es. – liang

+0

Der C# -Code funktioniert nicht für mich. Eine funktionierende Lösung kann hier gefunden werden: https://stackoverflow.com/a/36720802/1999917 –

Antwort

33

Wenn der Benutzer versehentlich in die schwarze Konsolenfenster klickt, ändert sich der Cursor auf einem gefüllten weißen Rechteck, und die App hängt bei der nächsten Console.Write Anweisung, bis ein anderer Clic ist gemacht.

Dies ist eine generische Funktion des Konsolenfensters, wenn der "QuickEdit-Modus" aktiviert ist.

Um diese Funktion zu deaktivieren, sollten Sie die Option "QuickEdit-Modus" im Konsolenfenster Ihrer App zur Laufzeit deaktivieren.

+0

aaaaaaah, ich glaube, ich bemerkte, dass der Cursor sich änderte. Ich werde versuchen, dies zu bestätigen, wenn es das nächste Mal passiert. –

+0

@nextgenneo: Wenn es das ist, können Sie es programmgesteuert deaktivieren: http://bytes.com/topic/visual-basic-net/answers/366818-console-writerine-hangs-ifuser-click-into-console- Fenster – LaGrandMere

+0

ja, großartig. bestätigt das war das Problem! –

Verwandte Themen