Create gnuplot process and wait for its end (Currently Windows only)
before deleting the input files.
This commit is contained in:
parent
293b54c05b
commit
fbc17e7df9
|
|
@ -18,6 +18,7 @@
|
||||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
#if defined(__MINGW32__) || defined(_MSC_VER)
|
||||||
#undef BOOLEAN
|
#undef BOOLEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
static BOOL executeCommandLine(char* cmdLine);
|
||||||
#else
|
#else
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -262,9 +263,9 @@ void ft_gnuplot(double *xlims, double *ylims,
|
||||||
FILE *file, *file_data;
|
FILE *file, *file_data;
|
||||||
struct dvec *v, *scale = NULL;
|
struct dvec *v, *scale = NULL;
|
||||||
double xval, yval, prev_xval, extrange;
|
double xval, yval, prev_xval, extrange;
|
||||||
int i, dir, numVecs, linewidth, gridlinewidth, err, terminal_type;
|
int i, dir, numVecs, linewidth, gridlinewidth, terminal_type;
|
||||||
bool xlog, ylog, nogrid, markers, nolegend, contours = FALSE;
|
bool xlog, ylog, nogrid, markers, nolegend, contours = FALSE;
|
||||||
char buf[BSIZE_SP], pointstyle[BSIZE_SP], *text, plotstyle[BSIZE_SP], terminal[BSIZE_SP];
|
char buf[BSIZE_SP], buf2[BSIZE_SP], pointstyle[BSIZE_SP], *text, plotstyle[BSIZE_SP], terminal[BSIZE_SP];
|
||||||
|
|
||||||
char filename_data[128];
|
char filename_data[128];
|
||||||
char filename_plt[128];
|
char filename_plt[128];
|
||||||
|
|
@ -624,10 +625,11 @@ void ft_gnuplot(double *xlims, double *ylims,
|
||||||
(void) fclose(file_data);
|
(void) fclose(file_data);
|
||||||
|
|
||||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
#if defined(__MINGW32__) || defined(_MSC_VER)
|
||||||
/* for external fcn system() */
|
/* for external fcn CreateProcess() */
|
||||||
// (void) sprintf(buf, "start /B wgnuplot %s -" , filename_plt);
|
GetCurrentDirectory(BSIZE_SP, buf2);
|
||||||
(void) sprintf(buf, "start /B wgnuplot -persist %s " , filename_plt);
|
(void)snprintf(buf, sizeof(buf) - 1, "\"C:\\Program Files\\gnuplot\\bin\\wgnuplot.exe\" \"%s\\%s\"", buf2, filename_plt);
|
||||||
_flushall();
|
_flushall();
|
||||||
|
executeCommandLine(buf);
|
||||||
#else
|
#else
|
||||||
/* for external fcn system() from LINUX environment */
|
/* for external fcn system() from LINUX environment */
|
||||||
if (terminal_type == 3) {
|
if (terminal_type == 3) {
|
||||||
|
|
@ -644,15 +646,14 @@ void ft_gnuplot(double *xlims, double *ylims,
|
||||||
else {
|
else {
|
||||||
(void) sprintf(buf, "gnuplot -persist %s &", filename_plt);
|
(void) sprintf(buf, "gnuplot -persist %s &", filename_plt);
|
||||||
}
|
}
|
||||||
|
int err = system(buf);
|
||||||
#endif
|
#endif
|
||||||
err = system(buf);
|
|
||||||
|
|
||||||
/* delete the plt and data files */
|
/* delete the plt and data files */
|
||||||
if ((terminal_type == 3) || (terminal_type == 5)) {
|
if ((terminal_type == 3) || (terminal_type == 5)) {
|
||||||
/* wait for gnuplot generating eps or png file */
|
/* wait for gnuplot generating eps or png file */
|
||||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
#if !defined(__MINGW32__) && !defined(_MSC_VER)
|
||||||
Sleep(200);
|
|
||||||
#else
|
|
||||||
usleep(200000);
|
usleep(200000);
|
||||||
#endif
|
#endif
|
||||||
if (remove(filename_data)) {
|
if (remove(filename_data)) {
|
||||||
|
|
@ -819,3 +820,55 @@ void ft_writesimple(double *xlims, double *ylims,
|
||||||
|
|
||||||
(void) fclose(file_data);
|
(void) fclose(file_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__MINGW32__) || defined(_MSC_VER)
|
||||||
|
/* Executes the given command using CreateProcess() and WaitForSingleObject().
|
||||||
|
Returns FALSE if the command could not be executed or if the exit code could not be determined. */
|
||||||
|
static BOOL executeCommandLine(char *cmdLine)
|
||||||
|
{
|
||||||
|
PROCESS_INFORMATION processInformation = { 0 };
|
||||||
|
STARTUPINFO startupInfo = { 0 };
|
||||||
|
startupInfo.cb = sizeof(startupInfo);
|
||||||
|
int nStrBuffer = (int)strlen(cmdLine) + 50;
|
||||||
|
char* newcmdLine = TMALLOC(char, nStrBuffer);
|
||||||
|
memcpy(newcmdLine, cmdLine, strlen(cmdLine + 1));
|
||||||
|
|
||||||
|
// Create the process
|
||||||
|
BOOL result = CreateProcess(NULL, newcmdLine,
|
||||||
|
NULL, NULL, FALSE,
|
||||||
|
NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,
|
||||||
|
NULL, NULL, &startupInfo, &processInformation);
|
||||||
|
tfree(newcmdLine);
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
// CreateProcess() failed
|
||||||
|
// Get the error from the system
|
||||||
|
LPVOID lpMsgBuf;
|
||||||
|
DWORD dw = GetLastError();
|
||||||
|
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL);
|
||||||
|
|
||||||
|
// Display the error
|
||||||
|
char * strError = (LPTSTR)lpMsgBuf;
|
||||||
|
fprintf(stderr, "Error: executeCommandLine() failed at CreateProcess()\nCommand=%s\nMessage=%s\n\n", cmdLine, strError);
|
||||||
|
|
||||||
|
// Free resources created by the system
|
||||||
|
LocalFree(lpMsgBuf);
|
||||||
|
|
||||||
|
// We failed.
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Successfully created the process. Wait for it to finish.
|
||||||
|
WaitForSingleObject(processInformation.hProcess, INFINITE);
|
||||||
|
|
||||||
|
// Close the handles.
|
||||||
|
CloseHandle(processInformation.hProcess);
|
||||||
|
CloseHandle(processInformation.hThread);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue