Force Matlab to execute .NET callback on main/single thread

조회 수: 4 (최근 30일)
Phillip
Phillip 2016년 4월 8일
댓글: Mike 2016년 6월 7일
Hi
I wrote a simple matlab filewatcher object than uses .NET's FileSystemWatcher. It's a great little tool, works straight off the bat and you can add a Matlab callback directly. So far so good.
This worked perfectly in R2015a. I compile this in a larger stand-along application that my colleagues use and the .exe application works perfectly.
Enter R2015b (and R2016a): Works fine when running natively in Matlab but when run as a compiled .exe (even on my own machine) it crashes whenever the callback for the file watcher is asked to execute.
The reason for this is apparently that the callback tries to execute on a different thread and this crashes the application. This has been reported as bug 560506. It's been around for a long time (since R2009a) yet this doesn't happen in R2015a. In the bug report it says the workaround is to not invoke the callback MATLAB code delegate in a separate thread. Does anybody know how to do that?
I realise I could implement this in java but that requires java dev, it requires dragging a jar file along and requires "indirect" callback attachment. I also realize I could stay with R2015a but recently I have developed code with findgroups that obviously does not exist in R2015a.
So if anyone can point me in the right direction for forcing the callback execution on the main/single thread that would be absolutely great.
Regards, Phil

답변 (1개)

Rahul Goel
Rahul Goel 2016년 4월 12일
Hi Philip
There is no full proof work around for this issue. You can minimize the chances of running into this issue however by making sure you do not create multiple objects like the System.IO.FileSystemWatcher object which would raise an .NET event on the same external event (i.e. a file changing).
To confirm that you are running into this exact issue, load the matlab_crash_dump.NNN.dmp file into Visual Studio, debug the managed part of the code and confirm that the actual Exception which occurred is:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
  댓글 수: 3
Mike
Mike 2016년 6월 4일
편집: Mike 2016년 6월 4일
I think I am having this same issue. I can demonstrate it by compiling a simple guide app with a single "Start" button. The start button calls a .NET function "startEventThread" that creates a new thread that fires off 100 sequential events with 10ms delay. The events are caught in Matlab with a simple disp('Event Triggered'). This works in Matlab 2013b and 2016a. It also works when compiled in 2013b but it crashes when compiled in 2016a (it crashes from the very first event that is fired). Interestingly if I update my Start button callback to include pause(5) immediately after the .NET function startEventThread is called, the application surprisingly works when compiled in 2016a.
It seems to me that this is an issue introduced in 2015b. I frequently use .NET events fired from a separate .NET thread using compiled 2013b with no issues.
I have attached source code.
Mike
Mike 2016년 6월 7일
I just tested 2016b prerelease and the issue appears to be resolved. I guess we will have to wait until the official release to confirm.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 .NET Events and Delegates in MATLAB에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by