2010-12-15 11 views
25

Mam program konsoli, która ma różne składniki, które działają tak:Console Application Okna utknięcie (Needs wciśnięcie klawisza)

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

Moim głównym punktem wejścia wygląda [pseudo-owski kod]

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

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

Brak konsoli. Czyta gdziekolwiek. Mój problem jest CZASEM, że aplikacja będzie działała świetnie, ale potem przestanie i jeśli wciśniesz dowolny klawisz w oknie, zacznie działać. Zdarza się to dość rzadko, ale mam ten program wdrożony na ponad 100 maszynach wirtualnych działających 24/7 w zautomatyzowanym środowisku.

Również na komputerze mam kilka skryptów AHK i innych rzeczy, które manipulują myszą, ale nie wiem, czy to ma z tym coś wspólnego.

Należy również pamiętać, że czasami procesor naprawdę działa na 100% na komputerach, więc może priorytet wątku jest problemem?

ROZWIĄZANIE: Musisz wyłączyć tryb szybkiej edycji. Tutaj działa kod C# to zrobić:

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

spróbuj skomentować 'DoSomething();' i zobacz, czy zachowuje się tak samo – Andrey

+0

Odpowiedź w kodzie C# nie działa. Poniższa przyjęta odpowiedź brzmi. – liang

+0

Kod C# nie działa dla mnie. Działające rozwiązanie można znaleźć tutaj: https://stackoverflow.com/a/36720802/1999917 –

Odpowiedz

33

Jeżeli użytkownik przypadkowo kliknie w oknie czarnej konsoli kursor zmieni kształt na wypełnionym białym prostokątem, a aplikacja zawiesza się przy następnym Console.Write oświadczeniu, aż inny powstaje clic.

Jest to ogólna funkcja okna konsoli, gdy włączony jest tryb "QuickEdit".

Aby wyłączyć tę funkcję, należy odznaczyć opcję "QuickEdit Mode" w oknie konsoli aplikacji w czasie wykonywania.

+0

aaaaaah, myślę, że zauważyłem zmianę kursora. Spróbuję to potwierdzić, kiedy się to stanie. –

+0

@nextgenneo: Jeśli tak, możesz go wyłączyć programowo: http://bytes.com/topic/visual-basic-net/answers/366818-console-writeline-hangs-if-user-click-into-console- okno – LaGrandMere

+0

tak, świetnie. potwierdził, że to był problem! –