I have a mex file called in my MATLAB script. The mex function may take a while to run, so in order to prevent my code from "stopping there without any outputs", I put many printf
statements in the mex file to output some running information about the data being processed.
But when I call the mex function, it doesn't printf
anything and stays there during int's running. Finally, after finishing its work, it will printf
all the information I want -- NOT while it is running but after finishing. It's not what I want.
So I want to know how to make it not only printf
what I want but also printf
at the time I want it.
Yes, mexPrintf
is what you need. But note that the command window does not forcibly flush the buffer it uses, often resulting in very long delays before your message is printed. This happens if you begin heavy computations after calling mexPrintf
.
A workaround is to use
mexEvalString("drawnow;")
after each call to mexPrintf
.
If you find that unappealing, you can make a macro that calls both:
#define printfFnc(...) { mexPrintf(__VA_ARGS__); mexEvalString("drawnow;");}
This uses the variadic macro __VA_ARGS__
. It may not be a part of a standard, but seems to be in GCC and Visual C++. Just call printfFnc
like you would call printf
(or mexPrintf
).
There is an undocumented C++ function that resides in libmwservices.dll
. It apparently flushes the output buffer. Here is an example:
#include "mex.h"
#pragma comment(lib, "libmwservices.lib")
extern bool ioFlush(void);
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
for(int i=0; i<100000; i++) {
mexPrintf("%d\n", i);
ioFlush();
}
}
Simply compile it as: mex -largeArrayDims test_mex_print.cpp
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With