GUIDE を使用して、Matlab で GUI を作成しています。ユーザーが GUI の [開始] ボタンを押すと、無限ループで実行されるバックグラウンドで最適化タスクが開始されます。反復ごとに、いくつかの情報を GUI に出力します。
そのスタートボタンを押してGUIウィンドウを閉じると、Matlabがフリーズします。GUI を実行しても、「開始」ボタンを押さずに GUI を閉じると、フリーズしません。
凍結を避けるにはどうすればよいですか?
GUIDE を使用して、Matlab で GUI を作成しています。ユーザーが GUI の [開始] ボタンを押すと、無限ループで実行されるバックグラウンドで最適化タスクが開始されます。反復ごとに、いくつかの情報を GUI に出力します。
そのスタートボタンを押してGUIウィンドウを閉じると、Matlabがフリーズします。GUI を実行しても、「開始」ボタンを押さずに GUI を閉じると、フリーズしません。
凍結を避けるにはどうすればよいですか?
また、たとえば100Kの反復後に無限に実行すると、matlabのメモリの断片化が原因で、GUIが応答しなくなる可能性があることも発見しました。その後、不要な一時変数をすべて割り当て解除し、結果を.matファイルに保存した後、GUIに強制終了して新しいコピーを開くように指示しました。 autohotkeyから、previous.matファイルから以前のすべての変数をロードするGUIが無限のサイクルで機能するようになりました
開始した無限ループは、それ以上のイベント(つまり、ウィンドウを閉じるイベント)の処理を許可していません。割り込みメカニズムの発生を許可する必要があります。'interruptible'
プロパティのデフォルト'on'
はですが、別の要件を満たす必要があります。
コールバックが実行されているオブジェクトのInterruptibleプロパティがオンの場合、コールバックを中断できます。ただし、それまたはそれがトリガーする関数がdrawnow、figure、getframe、pause、またはwaitforを呼び出す場合にのみ中断されます。定義されたタスクを実行する前に、これらの関数は、待機中のコールバックを含む、イベントキュー内のすべてのイベントを処理します。実行中のコールバック、またはそれがトリガーする関数がこれらの関数のいずれも呼び出さない場合、オブジェクトのInterruptibleプロパティの値に関係なく、コールバックを中断することはできません。
pause
ループがあるので、またはコマンドを挿入しdrawnow
て、MATLABが他のボタンのマウスクリックなどの他のイベントを処理できるようにすることができます(pause(0)
動作する可能性があります-テストされていません-実際にループを遅くすることなく割り込みイベントをチェックできます割り込みはありません)。
(補足:ctrl-cはループから抜け出すので、いつでもそれを行うことができますが...理想的ではありません。)
関数 (コールバック) を中断するには、 tmpearceの回答で指摘されているように、 drawow、figure、getframe、pause、または waitfor への呼び出しを含める必要があります。また、ボタン GUI コンポーネントでプロパティinterruptible
を設定する必要があります。on
だから私は無限(エンドレス)サイクルの中に一時停止を入れました。ただし、うまく機能しませんでした:pause(0.0000000000000001)
進行が大幅に遅くなりました (測定したので、主観的ではありません)。pause(0)
サイクルを遅くせず、GUI を更新できるようにしましたが、別のボタンが押された後に他のコールバックを実行できませんでした。
drawnow;
サイクル内でコマンドを使用することになりました。サイクルが大幅に遅くなることはなく (5% 未満の速度低下)、GUI は期待どおりに機能します。
matlab guis には多くのオブジェクトがあります。GUI を閉じると、オブジェクトは消えます。
場合によっては、ウィンドウを閉じた後もスレッドが残り、プログラムが実行され続けることがあります。
このスレッドを閉じるには、GUI に埋め込まれた軸を使用し、ループごとに軸が存在することを確認します。
h=gca;
for x = 1:WIDTH:(size(image,1)-WIDTH-OVERLAP-1)
for y = 1:HEIGHT:(size(image,2)-HEIGHT-OVERLAP-1)
%if the main gui closes, then the axis will change...
%in that case, you should stop this thread.
if(h == gca)
window = image(x:x+WIDTH+OVERLAP,y:y+HEIGHT+OVERLAP);%%account for a 10 pixel overlap
imshow(window)
pause(.01);
else
close all;
return;
end
end
end
matlabpool
事前に使用するだけで、GUIの応答性が維持されることを学びました。基本的に、計算は自動的にワーカー スレッドに入れられます。
残念ながら、現在、リファレンスを見つけることができません。しかし、あなたは黒魔術を試してみたいと思っているかもしれません;)