5

Estoy desarrollando una aplicación Windows forms que se conecta a un hardware, adquiere una gran cantidad de datos (~ 1 GSample/sec), lo procesa y lo escupe en la pantalla al hacer clic en un botón. Ahora estoy tratando de automatizar el proceso en un bucle que se puede iniciar/detener en cualquier momento para que pueda controlarlo mientras ajusta la entrada al hardware de adquisición. Creo que está claro que necesito hacer esto en un hilo separado, pero me está costando mucho intentar hacer esto en C++/cli. He encontrado varios ejemplos buenos usando MFC, que no es compatible con Exprimir.C++ MultiThreading con visual studio express 2010 Formularios Aplicación

Específicamente: Mi tarea es presionar un botón que se maneja en Form1.hy llamar a una función en mi archivo principal Acquisition.cpp que contiene el siguiente código (en la actualidad un bucle infinito)

void Form1::realTimeUpdate() 
{ 
    // live is a boolean variable set by a button on the form 
    while(live) 
    { 
     displayVariance(getVar(getQuadratures(100),nbrSamples)); 
    } 
} 

Deseo ejecutar este código en un hilo separado para que el programa principal pueda escuchar la solicitud del usuario para detener la operación. Sin enhebrar, actualmente tengo que cerrar el programa por la fuerza (o configurarlo para que funcione un número fijo de veces) para detenerlo.

¿Hay alguna sugerencia sobre cómo puedo ejecutar este código en un hilo separado?

He (sin éxito) intentó algunas cosas ya:

  1. Modificar el ejemplo dado en This Microsoft Example. Problema: requiere la opción /clr: oldSyntax que es incompatible con las otras 1300 líneas de código en el programa.

  2. Tratando de hacer lo que haría en Java (declare un hilo global y comience/detenga desde cualquier punto del código. Problema: el compilador no me deja declarar un sistema global :: Threading.Thread

    .
  3. this bello ejemplo Problema: Requiere MFC

Cualquier sugerencia sería muy apreciada

+0

Solo enviaría un mensaje a la ventana principal, pero soy de la vieja escuela. –

Respuesta

1

puede utilizar un BackgroundWorker o un hilo para manejar esta tendrá que asegurarse.!. que el Sin embargo, una parte de su trabajo que actualiza la UI se clasifica de nuevo al hilo de la interfaz de usuario.

Aquí hay un tutorial on threading in C++/CLI.

+0

Gracias Reed, no sabía acerca de BackgroundWorker. Resultó ser el camino a seguir. Publiqué cómo ayudó a continuación. – Orko

0

Para el registro, por sugerencia de Reed sobre el uso de un BackgroundWorker, filtraba a través del código en la parte inferior de this página y modificar mi código para que:

  1. Se creó una nueva BackgroundWorker BGWorker en el que BGWorker -> DoWork() llamó a mi función realTimeUpdate().

  2. Un botón en el formulario principal llama a RunWorkerAsync() o CancelAsync() dependiendo de si el proceso se está ejecutando o no (marcado por un indicador booleano en mi programa principal).

  3. La función realTimeUpdate() se pasa ahora a BackgroundWorker - realTimeUpdate(BackgroundWorker^ worker, DoWorkEventArgs^e) Después de que cada cálculo se completa dentro del ciclo interno, llama a la función worker-> ReportProgress (result). En la función BGWorker-> ProgressChanged(), una función separada, upDataUI (int) dibuja el resultado en el formulario principal.

Gracias de nuevo por la ayuda.

Cuestiones relacionadas