Using findjobj in R2013a

I am trying to use Yair's FEX:findjobj in R2013a on Linux to basically do what he did in his blog post
desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
jEditor = desktop.getGroupContainer('Editor').getTopLevelAncestor;
jEditor.findjobj
This causes MATLAB to become unresponsive and basically hang. I unfortunately don't have any other versions of MATLAB currently. Can anyone reproduce this?

 Accepted Answer

I did a little profiling and found the problem. The findobj function calls home to the FEX and checks for a newer version in the checkVersion subfunction. On my system this fails because urlread times out (which takes a long time). The checkVersion subfunction catches the error and then discards it, which makes it tough to figure out what is going on. Using the undocumented feature of findobj
addpref('FindJObj','dontCheckNewerVersion', true)
stops from calling home and avoids the problems. I wonder if an error on trying to check the newer version should automatically set the preference to not check for updates.

More Answers (2)

per isakson
per isakson on 27 Sep 2013
Edited: per isakson on 27 Sep 2013
It seems to work fine here: R2013a, 64bit, Win7
>> desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
jEditor = desktop.getGroupContainer('Editor').getTopLevelAncestor;
jEditor.findjobj
ans =
handle: 1-by-1620
>> version
ans =
8.1.0.604 (R2013a)
and the GUI is responsive

1 Comment

Thanks. I wonder if it is Linux or my machine. Will have to keep searching.

Sign in to comment.

Yair Altman
Yair Altman on 5 Oct 2013

1 vote

You only need to use findjobj without an output (result assignment) value if you want to see an interactive GUI display of all the objects in your analyzed object (in this case Desktop). If your Desktop contains numerous panels/windows/docked figures etc., then there might be so many descendant objects that it would take a long time (and large amounts of memory) to process, which might explain what you see.
If you only need findjobj to get the underlying reference of something, then assign a result (e.g., something=findjobj(...); ) and this should solve the issue. If you want to see the interactive GUI, then consider reducing your Desktop's complexity by closing some panels, or maybe start Matlab when it has access to more physical memory (to prevent virtual memory usage and thrashing).

3 Comments

I only have problems with the interactive GUI. I can now confirm the problem on two separate machines. Machine A is running Arch Linux with a reasonable number of programs running. The machine has 8 GB of ram of which 2 GB is free . Machine B is running Debian stable with essentially nothing other than MATLAB running. I am accessing it via ssh so there is not even a WM/DE running. The machine has 32 GB of ram with with over 30 GB free. In both cases the desktop layout is set to "Command Window Only" such that there is the command window, the editor with a single file open, and a single empty figure window. There are no other tabs open on the MATLAB desktop. While 30 GB of free ram is not a lot these days, I see no indication that I am using virtual memory or even a substantial spike in CPU usage.
Try setting the desktop layout to the default and retest. Perhaps findjobj gets stuck in some endless loop if id can't find one of the standard Desktop components. If this is the case, you can start peeling off Desktop panels one by one until you get to the culprit.
The hang happens in checkVersion. See my answer.

Sign in to comment.

Categories

Find more on Environment and Settings in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!