Azzera filtri
Azzera filtri

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

5 visualizzazioni (ultimi 30 giorni)
koji fukumoto
koji fukumoto il 3 Dic 2018
Modificato: Kazuya il 3 Dic 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
よろしくお願い致します。

Risposta accettata

Kazuya
Kazuya il 3 Dic 2018
Modificato: Kazuya il 3 Dic 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 内の処理が確認できないので少し不安が残ります。

Più risposte (0)

Categorie

Scopri di più su MATLAB Support Package for USB Webcams in Help Center e File Exchange

Prodotti


Release

R2018a

Community Treasure Hunt

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

Start Hunting!