2010-12-15 6 views
25

que tienen un programa de consola que tiene diferentes componentes que se ejecutan como esto:aplicación de consola de Windows se queda pegada (necesidades clave Press)

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

Mi punto de entrada principal se parece a [código de pseudo-ish]

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

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

No hay Console.Reads en cualquier lugar. Mi problema es A VECES la aplicación se ejecutará bien, pero luego se detiene y si presiono cualquier tecla en la ventana, comenzará a funcionar de nuevo. Esto ocurre con poca frecuencia, pero tengo este programa implementado en más de 100 máquinas virtuales que funcionan 24/7 en un entorno automatizado.

También en la computadora tengo algunas secuencias de comandos AHK y otras cosas que manipulan el mouse pero no estoy seguro si eso tiene algo que ver con eso.

También tenga en cuenta que a veces la CPU realmente se puede ejecutar al 100% en las máquinas, por lo que tal vez la prioridad de la rosca sea un problema.

SOLUCIÓN: Necesita desactivar el modo de edición rápida. Aquí está trabajando código C# para hacer esto:

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

intenta hacer un comentario 'DoSomething();' y ver si se comporta igual – Andrey

+0

La respuesta en el código C# no parece funcionar. La respuesta aceptada a continuación sí. – liang

+0

El código de C# no funciona para mí. Una solución de trabajo se puede encontrar aquí: https://stackoverflow.com/a/36720802/1999917 –

Respuesta

33

Si el usuario hace clic accidentalmente en la ventana de consola negro, el cursor cambia a un rectángulo blanco lleno, y la aplicación se cuelga en la siguiente sentencia Console.Write, hasta que otro clic está hecho.

Es una característica genérica de la ventana de la consola cuando su "Modo de edición rápida" está habilitado.

Para deshabilitar esa característica, debe desmarcar la opción "QuickEdit Mode" de la ventana de la consola de su aplicación en tiempo de ejecución.

+0

aaaaaaah, creo que noté que el cursor cambiaba. Intentaré confirmar esto cuando suceda. –

+0

@nextgenneo: si es así, puede desactivarlo mediante programación: http://bytes.com/topic/visual-basic-net/answers/366818-console-writeline-hangs-if-user-click-into-console- ventana – LaGrandMere

+0

sí, genial. ¡confirmó que este era el problema! –

Cuestiones relacionadas