6

matlab コンパイラで作成したアプリケーションがあります。終わっ
たら何とかしたいです。shutdown activitiesmatlab でシグナルをキャッチするのは不可能に思える (またはできない) ため、使用することを確認しましたonCleanup( Matlab: Is it possible to create signal handlers (.m scripts) )。matlab (ネイティブ) 内で動作していますが、コンパイルされたアプリケーション内では動作していません。CTRL-Ctaskkill (でのみ動作する/f
) でアプリケーションを終了しようとしました。どちらの場合も、onCleanup メソッドは実行されませんでした。 ここでテスト目的で

function sigtest(varargin)
remainder=onCleanup(@()save('exit.mat'));
b=1;
while true
    disp(datestr(now));
    a=rand(round(5*b));%to be saved
    pause(10);
    b=a(1);
end

経由でコンパイルした私のソースコードmcc -m -v sigtest.m
試しに、行を挿入しました

myexiter=addlistener(System.AppDomain.CurrentDomain,'ProcessExit',...
    @(a,b)save('listexit.mat'));

2行目以降だけでなく、この.NETイベントも機能していません。

4

1 に答える 1

4

Mコード内でシャットダウンアクティビティを登録している場合、それらはプロセスの正常なシャットダウンでのみ機能します。このtaskkill /fコマンドは「強制的な」シャットダウンを実行します。これにより、プロセスがすぐに終了すると思います。Matlabインタープリターは、まだ保留中のクリーンアップコードを実行する機会を取得しません。コンソールアプリケーション(コンパイルされたsigtest.mが実行される)のCtrl-Cも同じ効果があると思います。同じことが.NET-Eventにも当てはまります。プロセスを強制的に強制終了した場合、そのコールバックは実行される機会がありません。

終了時のコードやその他のクリーンアップを実行する場合は、プログラムがいつ終了するかを見つけて、より適切なシャットダウンを開始する方法を見つける必要があります。たとえば、sigtestの例では、ループを通過するたびにstdinをチェックし、ユーザーが「quit」と入力したかどうかを確認し、入力した場合は。を呼び出しますexit()。次に、onCleanupのものが実行されます。

GUIでコンパイルされたMatlabアプリケーションでは、これはより簡単です。アプリケーションを終了するためのGUIコントロールがあります。コンソールでコンパイルされたMatlabアプリケーションをユーザーの終了要求に応答させるための標準的な方法はわかりません。また、適切な方法があるかどうかもわかりません。ユーザーが操作の正常な中止を要求する可能性があると思われる場合は、これをGUIアプリにすることをお勧めします。

于 2013-01-04T07:00:33.153 に答える