2011-04-11 45 views
5

Quiero que el programa espere a que se presione un botón antes de que continúe, intenté crear un ciclo while y tenerlo en bucle hasta que se haga clic y establecer un bool en true para el bucle while a extremo, esto hizo que choqueC# Hacer que se presione el botón Esperar programa

while (!Redpress) 
        { 
         //I'd like the wait here 
        } 
        Redpress = false; 

no importa si el tiempo está ahí, siempre y cuando el programa espera a que el botón de prensa antes de "Redpress" false .. . ¿Algunas ideas?

+0

El evento del botón ya está allí, necesito que el programa espere el evento. – Zizo47

+0

No puede escribir código como este en un subproceso de interfaz de usuario. Congelará la IU. Comprender la naturaleza impulsada por eventos de la programación de IU es esencial para salir adelante. –

Respuesta

6

Usa eventos: es para lo que están diseñados.

No es necesario utilizar una variable booleana para esto en el manejador de eventos Button_Click llame a su código:

private void Button_Click(object sender, EventArgs e) 
{ 
    // The code you need to execute when the button is pressed 
} 

Como @trickdev señala que tendrá que suscribirse a este evento, pero si se utiliza el Ventana de eventos en Visual Studio agregará el código necesario, incluido el controlador vacío, para usted.

Con los programas controlados por eventos siempre está esperando hasta que suceda la siguiente "cosa". Entonces, en su caso (si he entendido bien su aplicación) cuando inicia el programa, simplemente debe indicarle al primer botón que destelle "N" veces. Si escribe eso como un evento, la aplicación volverá al estado de espera una vez que el código se haya completado.

Luego en el botón haga clic en controlador de eventos - puede suscribir todos los botones para el mismo evento - puede verificar que se haya presionado el botón correcto y luego decirle al botón siguiente que destelle. Si se presionó el botón incorrecto, se mostrará un mensaje adecuado.

Así que en pseudo código que tienen:

public class Form 
{ 
    Initialise() 
    { 
     this.Loaded += FormLoaded; 
    } 

    private void FormLoaded(object sender, EventArgs e) 
    { 
     // pick a button 
     pickedButton.Flash(); 
    } 

    private void Button_Click(object sender, EventArgs e) 
    { 
     if (sender == pickedButton) 
     { 
      pickedButton = pickButton(); 
     } 
     else 
     { 
      message = "Sorry wrong button, try again"; 
     } 

     pickedButton.Flash(); 
    } 
} 

public class Button 
{ 
    public void Flash() 
    { 
     // loop N times turning button on/off 
    } 
} 
+0

Eso no tiene sentido, redpress es un bool que define si se ha hecho clic en el botón o no, ya tengo un evento para configurar el bool en true cuando se presiona el botón. Necesito un código para que el programa espere el evento ... – Zizo47

+0

@ Zizo47 - lo siento, lo malentendí - ponga el código que necesita en el controlador donde lo he indicado con el comentario. – ChrisF

+0

Esto todavía no cambia nada, necesito que el programa se detenga y espere a que haga clic en el botón, no tengo problemas con el botón en sí. – Zizo47

3

controles de Windows Forms tienen un evento Click se puede suscribir en el constructor del formulario:

myButton.Click += myButton_EventHandler; 

A continuación, puede poner lo que la lógica que desea suceder en el controlador y esto se ejecutará cuando se haga clic en el botón:

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    Redpress = false; 
} 

Debe evitar bloquear (de alguna manera, girar durmiendo, etc.) el hilo Principal en las aplicaciones de sus formularios, ya que esto bloqueará la interfaz, existen muchos métodos para evitar esto, incluidos Timers, Threads, Delegates y BackgroundWorkers, por nombrar algunos.

EDIT: Para incluir su actualización

Para ello se puede utilizar un ManualResetEvent.

private readonly ManualResetEvent mre = new ManualResetEvent(false); 

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    mre.Set(); 
} 

el código del formulario puede esperar llamando:

mre.WaitOne(); 

Esto hará que la espera código que se ejecuta hasta que se haya disparado. Espero que ayude.

NOTA: Por favor, no te equivoques, a menos que tengas un caso especial (no puedo pensar en ninguno de estos a esta hora de la noche) debes poner el código en el evento controlador, en lugar de bloquear un hilo hasta que el evento se haya disparado.

+0

Todo lo que ha hecho allí está configurado como redpress a falso con un evento, necesito que el programa espere ese evento "that" ... – Zizo47

+0

Eso debería ser el truco. – trickdev

0

Si necesita que el programa espere ese evento, entonces no escriba el código waitForTheButton en su acceso principal/carga de página.

En su lugar escriba su código dentro de el evento. Entonces no tienes que esperar activamente. Los eventos son por eso.

por ejemplo: si tiene algo como esto

static void Main() 
{ 
    while (notPressed) { } 
    DoThis(); 
    DoThat(); 
} 

Entonces usted podría estar cambiando a:

static void Main 
{ 
    myButton.OnClick += myButton_EventHandler; 
} 

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    DoThis(); 
    DoThat(); 
}          

Si realmente quiere trabajar en un procedimiento paradigma incluso cuando está utilizando un OOP idioma, debe utilizar un semáforo o algo así. Pero eso no parece ser lo que realmente necesita , es más como algo que quiere.

Cuestiones relacionadas