none
Bucle infinito sin consumir procesador RRS feed

  • Pregunta

  • ¡Hola a todos!

    Tengo un programa en C# hecho MUY básico donde, en el cual, tengo un thread. Dicho thread ejecuta un método donde este tiene un bucle infinito con while (true). El programa funciona correctamente. Sin embargo, dicho bucle consume muchísimo: pasa de consumir un 1% de mi procesador a consumir un 18%. Me gustaría saber una forma de hacer dicho bucle (o método, o subproceso de forma infinita) de una forma correcta para optimizar código y, así, que no consuma procesador, o consuma muy poco.

    Muchas gracias. Un saludo.

    • Cambiado Karen Malagón martes, 21 de abril de 2015 20:59 Windows Forms issue
    jueves, 16 de abril de 2015 9:58

Respuestas

  • Acabo de probarte esto  stackoverflow.com y funciona correctamente, ya contaras.

    Pego aquí el código que he usado en mi programa:

            const int MYACTION_HOTKEY_ID = 1;
            // DLL libraries used to manage hotkeys
            [DllImport("user32.dll")]
            public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
            [DllImport("user32.dll")]
            public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
            public Form1()
            {
                InitializeComponent();
    
                // Modifier keys codes: Alt = 1, Ctrl = 2, Shift = 4, Win = 8
                // Compute the addition of each combination of the keys you want to be pressed
                // ALT+CTRL = 1 + 2 = 3 , CTRL+SHIFT = 2 + 4 = 6...
                RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int)Keys.CapsLock);
    
                Form2 frm = new Form2();
                frm.ShowDialog();
            }
    
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID)
                {
                    // My hotkey has been typed
    
                    // Do what you want here
                    // ...
                }
                base.WndProc(ref m);
            }
        }

    La llamada a Form2 se puede eliminar, solo queria comprobar que funcionase en modal.

    Saludos,


    • Editado David Porqueras jueves, 16 de abril de 2015 11:20
    • Marcado como respuesta V_Light lunes, 18 de mayo de 2015 9:37
    jueves, 16 de abril de 2015 11:14
  • >>¿esto funciona como el detector de la tecla o por el bucle?

    exacto solo que detecta a nivel de interupciones del sistema operativo, es a bastante as bajo nivel

    >>¿Este código va incluido ese "bucle" y está comprobando el estado de la tecla continuamente durante la ejecución?

    si usas las api de windows  ya no necesitas el bucle


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta V_Light lunes, 18 de mayo de 2015 9:37
    jueves, 16 de abril de 2015 23:06

Todas las respuestas

  • Hola,

    Si no es necesario ejecutar procesos en cada iteración tal vez podrías usar Thread.Sleep para hacer pequeñas pausas y así liberar un poco el proceso.

    Saludos,

    jueves, 16 de abril de 2015 10:11
  • La verdad es que no creo que sea buena idea que haga eso. Mi idea es hacer un bucle infinito el cual esté comprobando continuamente el estado de una tecla (si está pulsada o no) y dependiendo de eso se ejecuta una acción u otra. Mi idea es que esté comprobando continuamente el estado de esa tecla, pero no se si lo puedo hacer de otra forma... mi idea fue hacer un bucle.

    Un saludo, y gracias.

    jueves, 16 de abril de 2015 10:31
  • que tipo de aplicación es? winforms? consola?

    Si es winforms siempre puedes utilizar los eventos keypress y keydown

    jueves, 16 de abril de 2015 10:36
  • Es in WinForms y estoy utilizando Control.IsKeyLocked(Keys.CapsLock) en un bucle
    jueves, 16 de abril de 2015 10:44
  • hola

    >>Mi idea es que esté comprobando continuamente el estado de esa tecla, pero no se si lo puedo hacer de otra forma

    o sea quieres capturar una tecla aunque tu aplicacion no tenga el foco ?

    si es asi hay apis de window que te permiten lograrlo, a esta tecnica se la llama hooking

    Como detectar la pulsacion de una tecla con el programa minimizado

    no voy a decir que es algo simple de lograr, pero si quieres realizar una accion cuando se presiona una tecla sin que tu aplicacion tenga el foco es el camino

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 16 de abril de 2015 11:07
  • Acabo de probarte esto  stackoverflow.com y funciona correctamente, ya contaras.

    Pego aquí el código que he usado en mi programa:

            const int MYACTION_HOTKEY_ID = 1;
            // DLL libraries used to manage hotkeys
            [DllImport("user32.dll")]
            public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
            [DllImport("user32.dll")]
            public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
            public Form1()
            {
                InitializeComponent();
    
                // Modifier keys codes: Alt = 1, Ctrl = 2, Shift = 4, Win = 8
                // Compute the addition of each combination of the keys you want to be pressed
                // ALT+CTRL = 1 + 2 = 3 , CTRL+SHIFT = 2 + 4 = 6...
                RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int)Keys.CapsLock);
    
                Form2 frm = new Form2();
                frm.ShowDialog();
            }
    
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID)
                {
                    // My hotkey has been typed
    
                    // Do what you want here
                    // ...
                }
                base.WndProc(ref m);
            }
        }

    La llamada a Form2 se puede eliminar, solo queria comprobar que funcionase en modal.

    Saludos,


    • Editado David Porqueras jueves, 16 de abril de 2015 11:20
    • Marcado como respuesta V_Light lunes, 18 de mayo de 2015 9:37
    jueves, 16 de abril de 2015 11:14
  • Saludos ,

    Hasta donde yo se esta relacion entre los bucles y el aumento en el trabajo del procesador es muy normal, pues es una carga de trabajo constant para el procesador.

    jueves, 16 de abril de 2015 21:41
  • Muchas gracias por responder, pero ¿esto funciona como el detector de la tecla o por el bucle? Mi interés es un bucle infinito el cual este comprobando la tecla (osease, me interesa el bucle en sí). ¿Este código va incluido ese "bucle" y está comprobando el estado de la tecla continuamente durante la ejecución?

    Muchas gracias. Un saludo.

    jueves, 16 de abril de 2015 21:45
  • ¡Hola!

    Me interesa que durante la ejecución del programa esté comprobando continuamente el estado de una tecla.

    Muchas gracias. Un saludo.

    jueves, 16 de abril de 2015 21:46
  • Hola,

    Esta constantemente comprobando la pulsación de la tecla.

    jueves, 16 de abril de 2015 22:10
  • Hola, Mas bien lo que tratan de decirte es que no necesitas que un loop este constantemente verificando el estado de la tecla, si no que, cuando haya un cambio en el estado de la tecla se va a generar un evento. Para eso puedes utilizar cualquiera de las opciones que te estan sugiriendo.

    Saludos!

    jueves, 16 de abril de 2015 22:25
  • >>¿esto funciona como el detector de la tecla o por el bucle?

    exacto solo que detecta a nivel de interupciones del sistema operativo, es a bastante as bajo nivel

    >>¿Este código va incluido ese "bucle" y está comprobando el estado de la tecla continuamente durante la ejecución?

    si usas las api de windows  ya no necesitas el bucle


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta V_Light lunes, 18 de mayo de 2015 9:37
    jueves, 16 de abril de 2015 23:06
  • Muchas gracias, me sirvió, era justamente lo que necesitaba. ¡Un saludo!
    lunes, 18 de mayo de 2015 9:37
  • Muchas gracias, era lo que necesitaba. ¡Un saludo!
    lunes, 18 de mayo de 2015 9:38