MATLAB Answers

CloseReque​stFcnコールバッ​クが実行されない

9 views (last 30 days)
koji fukumoto
koji fukumoto on 3 Dec 2018
Edited: Kazuya on 3 Dec 2018
・Figure上にWEBカメラ映像を表示
・終了ボタン、またはクローズボタン(ウインドウ右上の×ボタン)押下でアプリ終了
というアプリを作成したのですが、クローズボタン押下(CloseRequestFcn)が反応しません。
(my_closereq関数に処理が飛んできません)
「カメラ映像を表示するコード」をコメントアウトするとクローズボタン押下が反応してアプリが終了します。
実装方法で不適切な点などございますでしょうか?
※カメラ映像を表示する処理は
で頂いた回答を参考にしております。
% カメラハンドル取得
hCam = webcam(1);
% 実行画面GUIの作成と、不要なfigureデータの解放
figHandle = createWindow(hCam);
while true
pause(0.001);
% [終了]ボタン押下、またはクローズボタン押下時は即終了
if(isvalid(hPbExit) == 1 && getappdata(hPbExit, 'exitKeyPressed') == 1)
if(isvalid(hCam) == 1)
hCam.closePreview;
delete(hCam);
end
delete(figHandle);
return;
end
end
% [終了]ボタン押下時コールバック関数
function exitPressFcn(hObject, ~)
setappdata(hObject, 'exitKeyPressed', 1);
end
% Closeイベントハンドラ
function my_closereq(src,callbackdata)
global hPbExit;
setappdata(hPbExit, 'exitKeyPressed', 1);
end
% 実行画面作成関数
function figHandle = createWindow(hCam)
global hPbExit;
% ウインドウの生成
figHandle = figure('CloseRequestFcn', @my_closereq, 'Name', 'Tracker', 'tag', 'mainFigure', 'OuterPosition', [100, 100, 800, 800]);
clf(figHandle);
set(figHandle, 'Name', 'カメラ映像', 'NumberTitle', 'off')
set(figHandle, 'MenuBar', 'none');
% 以下の処理をコメントアウトすると、クローズボタンが効くようになる
%-----------------------------------------------
% カメラ映像を表示
if(isempty(hCam) == 0 && isvalid(hCam) == 1)
ax = axes('parent', figHandle);
yticks(ax, []);
xticks(ax, []);
frame = snapshot(hCam);
im = image(ax, zeros(size(frame), 'uint8'));
axis(ax, 'image');
preview(hCam, im);
end
%-----------------------------------------------
% 終了ボタンを配置
hPbExit = uicontrol(figHandle, 'Style', 'pushbutton', 'String', '終了', 'FontSize', 12,...
'Units', 'normalized', 'Position', [0.6 0.1 0.3 0.05], 'Callback', @exitPressFcn);
setappdata(hPbExit, 'exitKeyPressed', 0);
drawnow;
end
よろしくお願い致します。

  0 Comments

Sign in to comment.

Accepted Answer

Kazuya
Kazuya on 3 Dec 2018
Edited: Kazuya on 3 Dec 2018
解決策まで行きついていませんが、my_closereq関数に処理が飛ばない原因だけはわかったので共有しますね。。
preview(hCam, im);
を呼ぶ前後でブレークポイントを設定して見てもらえれば分かりますが、preview の実行によって figHandle の CloseRequestFcn が書き換えられています。
preview 前
K>> figHandle.CloseRequestFcn
ans =
値をもつ function_handle:
@my_closereq
preview 後
K>> figHandle.CloseRequestFcn
ans =
値をもつ function_handle:
@(src,event)obj.closePreviewWindowCallback
もちろん、preview を実行後に改めて
figHandle.CloseRequestFcn = @my_closereq;
とコールバック関数を再設定すればうまくいっているようには見えますが、本来実行されるべき(?)closePreviewWindowCallback 内の処理が確認できないので少し不安が残ります。

  0 Comments

Sign in to comment.

More Answers (0)

Sign in to answer this question.

Products


Release

R2018a