Facts about MATLAB:
My problem:
MATLAB does not offer background threads, so to make MATLAB UI responsive we have to call function drawnow which flushes Swing EDT queue, see also here and here. This is a known fact, so far so good.
But now I have a customer whose code which performs the computation is a MATLAB p-file (encrypted) so I have no access to the code to put drawnow
there.
Unsuccessful attempt:
I tried spinning up a timer to do the job of calling drawnow
but it does not seem to work - timer itself needs a precedent drawnow
to fire its callbacks.
EDIT: At the end I implemented GUI with .NET/WPF running on another thread, so it remains always responsive and looks much better then original MATLAB.
I don't know whether this can be done properly. I've never found a way of getting the effect of drawnow in the middle of a mex file, and I would guess this situation is similar. But here is an incredibly messy hack anyway :D. If you have a p-file, you can run:
profile on;
pfile();
profile viewer;
and get an idea of what functions pfile() is calling. If the code is calling any built-in functions (e.g. disp) or any function whose source-code you have access to, you can create your own version of that file further up the path, which will be called by the p-file, e.g.
function disp(X)
if (toc > 5)
drawnow;
tic;
end
builtin('disp', X);
This will call drawnow at most once every 5 seconds, though it won't be much use unless disp were called regularly. If you can't find a builtin to override, you could use any other function and just insert the drawnow part at the top, like:
function primes(N)
if (toc > 5)
drawnow;
tic;
end
The rest of the original primes.m here.
Just an idea. You could build a jar file from the p-file using Matlab builder for java. From within Java you could do the calculation now in a separate thread.
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