2010-12-15 21 views

Respuesta

4

gnuplot admite la entrada a través de tuberías (en Windows, hay un ejecutable por separado, pgnuplot). Entonces su programa puede enviar nuevos comandos a gnuplot, como replot, como si los estuviera escribiendo directamente en la interfaz gnuplot.

La forma de configurar la conexión de tubería y escribir en el extremo emisor de la tubería desde su programa C++ varía según el sistema operativo, por lo que tendrá que decirnos qué está utilizando si desea obtener más ayuda.

En Windows, hay CreatePipe y luego configura el elemento hStdInput del STARTUPINFO estructura se pasa a CreateProcess. Ídem con hStdOutput si necesita los mensajes de estado de pgnuplot.

En POSIX (Unix, Linux, Mac OSX, etc.), puede usar popen como la forma más rápida de obtener una conexión unidireccional. Para bidireccional, funciona más como en Windows: pipe para obtener identificadores en los extremos, luego fork y en el proceso secundario llame al dup2 para asociar stdin y stdout con el conducto, luego exec para reemplazar gnuplot el proceso secundario, manteniendo las tuberías que preparar.

EDIT: De the gnuplot documentation:

El nombre de archivo especial ‘-’ especifica que los datos están en línea; es decir, ellos siguen el comando. Solo los datos siguen el comando; plot opciones como filtros, títulos y estilos de línea permanecen en el plot línea de comando. Este es similar a < < en script de shell unix, y $ DECK en VMS DCL. Los datos son ingresados ​​como si se estuvieran leyendo desde un archivo, un punto de datos por registro . La letra "e" al inicio de la primera columna termina la entrada de datos . El usando opción se puede aplicar a estos datos - usarla para filtrar ellos a través de una función podría hacer sentido, pero la selección de columnas, probablemente no lo hace!

+0

Pensé eso, pero ¿cuáles son los comandos para enviar puntos individuales? Solo sé cómo decirlo para trazar un archivo de datos o una función. ¿Cómo grafico como x1 y1, x2 y2, punto por punto? – chutsu

+0

@chutsu: No proporcioné esos detalles porque dijiste que ya conocías la parte de gnuplot. De todos modos, agregó el párrafo relevante de la documentación. –

1

Si está interesado en el trazado en tiempo real, probablemente sea mejor utilizar una API api acelerada por hardware (como OpenGL) y trazar el gráfico usted mismo.

+0

Am realmente espera utilizar gnuplot, porque eso es lo que Ready sé, he visto varias interfaces que los flujos de datos reales en gnuplot usando Perl, sino porque este es un trabajo para mi curso uni, la el director del curso realmente quiere que lo haga en C++. – chutsu

+1

Defina qué significa "en tiempo real" para usted. Si esto significa "25 actualizaciones por segundo", entonces gnuplot probablemente no sea para ti. – etarion

+0

1 parcela por segundo es suficiente para mí. – chutsu

0

En mi código C++, esto funcionó (en Mac OsX Mavericks, usando g ++ Apple LLVM versión 5.0):

#include <sys/types.h> 
#include <unistd.h> 

... 

// ready to make a plot 

pid_t childpid=fork(); 
if(childpid==0) { 
    // child process makes plot 
    std::FILE* pipehandle=popen("gnuplot -persist","w"); 
    // make some plot. You can send multiple commands to the pipe each ending in \n 
    std::fprintf(pipehandle,"plot \"results.txt\" using 1:2 with lines\n"); 
    std::fprintf(pipehandle,"quit\n"); 
    std::fflush(pipehandle); 
    std::fclose(pipehandle); 
    // child process exits 
    exit(0); 
} 
// parent process waits for child process to exit 
waitpid(childpid,NULL,0); 

// you can now repeat to make other gnuplots; all will appear simultaneously in the 
// terminal and are persistent after the parent process has finished. 
Cuestiones relacionadas