none
¿Como lanzar una interrupción en un Windows Form? RRS feed

  • Pregunta

  • Tengo un programa con dos botones, Start y Stop. Dicho programa una vez pulsado Start, necesita leer una cola de mensajes que manda un driver externo y procesarla.

    He probado a hacerlo con un Sleep(1000), pero como suponía se queda colgado el programa y no se puede pulsar el botón de Stop.

    Así que creo que tendré que hacerlo lanzando una interrupción cada segundo y creando un hilo al pulsar Start. Y eliminando el hilo al pulsar Stop.

    Nunca lo he usado así que no se si será fácil o difícil, y no encuentro nada de lanzar interrupciones por la web de msdn.

    Si tienen alguna idea de como hacerlo, expónganla, que no sé si se podrá hacer lo que yo digo.


    Un saludo y muchas gracias.
    miércoles, 4 de marzo de 2009 9:36

Respuestas

  • La forma más rápida es que sueltes un timer sobre la ficha y mires en cada disparo... Ten en cuenta que ese timer no va a ser muy preciso, lo que tienes seguro es que al menos se disparará pasado el tiempo que le marques... o más (generalmente más). Con el botón de start lo arrancas (timer->Start() ) y con el de parada lo paras: timer->Stop();

    Por otro lado tienes que tener cuidado con la forma de sacar los datos de donde quera que los saques ya que tendrás que sincronizarte con el que los coloca o podrías armarla (imagina que mientras que el otro proceso está metiendo algo, tu lo sacas cuando todavía no ha finalizado... etc).

    Otra forma es que te crees un hilo:

    Thread ^m_thread=gcnew Thread(ThreadStart(this,&Clase::Método));

    Y dentro de él tomes los datos teniendo en cuenta que desde ese hilo tampoco podrás acceder a la ficha si no es invocando delegados o eventos...
    • Marcado como respuesta alcalino jueves, 5 de marzo de 2009 9:52
    miércoles, 4 de marzo de 2009 15:25
    Moderador

Todas las respuestas

  •  Si utilizas comunicación por puerto serie al recibir datos te iría al siguiente evento:

    private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) {

    }

    miércoles, 4 de marzo de 2009 9:58
  • El programa que recibe los datos ya está hecho. Ahora tengo que hacer una interfaz gráfica para que sea más fácil de usar. Y ese es el problema, que el programa va metiendo datos en la cola, y yo cada segundo tengo que sacar los datos de esa cola y meterlos en un fichero. Pero siempre entre que se pulse el botón de Start y el de Stop. 
    miércoles, 4 de marzo de 2009 10:28
  • La forma más rápida es que sueltes un timer sobre la ficha y mires en cada disparo... Ten en cuenta que ese timer no va a ser muy preciso, lo que tienes seguro es que al menos se disparará pasado el tiempo que le marques... o más (generalmente más). Con el botón de start lo arrancas (timer->Start() ) y con el de parada lo paras: timer->Stop();

    Por otro lado tienes que tener cuidado con la forma de sacar los datos de donde quera que los saques ya que tendrás que sincronizarte con el que los coloca o podrías armarla (imagina que mientras que el otro proceso está metiendo algo, tu lo sacas cuando todavía no ha finalizado... etc).

    Otra forma es que te crees un hilo:

    Thread ^m_thread=gcnew Thread(ThreadStart(this,&Clase::Método));

    Y dentro de él tomes los datos teniendo en cuenta que desde ese hilo tampoco podrás acceder a la ficha si no es invocando delegados o eventos...
    • Marcado como respuesta alcalino jueves, 5 de marzo de 2009 9:52
    miércoles, 4 de marzo de 2009 15:25
    Moderador
  • Bueno al final he usado un hilo como me dice RFOG. Y dentro de él hago el Sleep, para que se ejecute cada segundo.

    Por cierto, por si a alguien le sirve esto más adelante, en la línea de crear el thread falta un gcnew:

    Thread ^m_thread=gcnew Thread(gcnew ThreadStart(this,&Clase::Método));


    Muchas gracias a todos.
    jueves, 5 de marzo de 2009 9:54
  • Son las cosas de escribir de memoria, je je. :-)
    jueves, 5 de marzo de 2009 9:59
    Moderador
  • Aun así fue de gran ayuda, porque ese fallo he tardado 5 segundos en verlo una vez la compilación falló.

    De otra manera aún estaría haciendo el gilipollas intentando crear un hilo.
    jueves, 5 de marzo de 2009 10:15
  • Perdonar eso de un hilo, ¿que es?
    Donde puedo encontrar información.
    Gracias
    jueves, 5 de marzo de 2009 12:00
  • "Hilo" es la palabra en castellano con que se designa a los "threads" en inglés.

    Una aplicación tiene un único proceso dentro del sistema operativo, que es donde se ejecuta. Digamos que el "proceso" es el tiempo que el sistema operativo deja que esa aplicación se ejecute. Pero una aplicación también puede crear "hilos" que dependan de ella, que básicamente es una función que se ejecuta "a la vez" que el programa principal.

    Lo tienes bastante más claro aquí:
    http://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3n

    jueves, 5 de marzo de 2009 12:05
    Moderador
  • Hola:

    Puedes descargar el manual en pdf sobre VC++ y  puerto serie.
    Saludo.

    http://electronica-pic.blogspot.com
    martes, 26 de mayo de 2009 21:51