Javaイベントハンドラからの呼出しでMathematica がハングするのはなぜでしょうか.
JavaユーザインターフェースのスレッドからMathematica を呼び出すときは常に,StdLink.requestTransaction()を呼び出して,続行するための許可を待たなければなりません.J/Link ユーザガイドの1.2.15「インストール可能なJavaクラスを書く」の「イベントハンドラコードを書く」にある関連事項をご参照ください.
安全を期するために,常に以下のイディオムを使うとよいでしょう.
StdLink.requestTransaction();
synchronized (ml) { ... use the link ... }/tt>
Mathematica を呼び出すJavaのコードでは,Mathematica を呼び出すクラスでこれを使うことをお勧めします.
StdLink.requestTransaction()が必要なのは「JavaがMathematica からInstallJavaによって起動されていて,このときユーザがMathematica からJavaを呼び出している最中ではない」という場合のみです.
このような条件が満たされる典型的な例は,JavaでのユーザアクションがMathematica の呼出しを引き起す場合です.
しかし,StdLink.requestTransaction()はこのような条件が満たされない場合でも安全に呼出しを行うことができます.言い換えるなら,これは不要な場合にはノーオペレーション命令となるのです.
このため,いろいろな状況で呼ばれる可能性があるために非常に一般的でなければならないコードの場合には,常に上記のイディオムを使ってStdLink.requestTransaction()を呼び出し,続けてリンクをロックするべきでしょう.
Questions or comments? Send email to support@wolfram.com.
|