0

複数のプッシュ ボタンが存在する MATLAB GUI を開発しました。各プッシュ ボタンは、無限ループの実行を開始します。プッシュ ボタンを押すと while ループは正常に実行されますが、次のプッシュ ボタンを押すと、最初のループが停止し、次のループが開始されます。MATLAB に Parallel Computing Toolbox というツールボックスがあることは知っていますが、その使用方法がわかりません。また、マルチスレッド技術を検索しようとしましたが、うまくいきませんでした。

どんな助けでも大歓迎です。

% --- Executes on button press in StartCam1.
function StartCam1_Callback(hObject, eventdata, handles)
axes(handles.axes1);
CamURL = 'http://192.168.1.2:80/jpg/image.jpg?timestamp='
Image  = imread(CamURL);
Frame = image(Image);

while(1)
   Image  = imread(CamURL);
   set(Frame,'CData',Image);
   drawnow;
end

% --- Executes on button press in StartCam2.
function StartCam2_Callback(hObject, eventdata, handles)
axes(handles.axes2);
CamURL = 'http://192.168.1.3:80/jpg/image.jpg?timestamp='
Image  = imread(CamURL);
Frame = image(Image);

while(1)
  Image  = imread(CamURL);
  set(Frame,'CData',Image);
  drawnow;
end
4

1 に答える 1

0

独立した「while」ループを考える代わりに、オプションで多くのサブ機能を実行する 1 つの大きなループについて考えてください。

% Pseudocode:
while !do_exit
    if (button1_active)
        % Do some things
    done
    if (button2_active)
        % Do some different things
    done
end

GUI を開いたときに開始し、GUI を閉じたときに終了するまで、このループを常に実行します。

または、タイマーの使用を検討してください。ボタンを押すと、タイマーが開始され、コールバック関数が実行され、while ループの 1 回の反復が実行されます。ボタンごとに 1 つのタイマーを使用して、個別に開始および停止できるようにします。これには、実行レートを制御できるという追加の利点があります。

編集: タイマー アプローチを採用し、カメラを 1 つだけリストします。もう一つは同じです。

% GUI Init
function gui_init
axes(handles.axes1);
handles.CamURL1 = 'http://192.168.1.2:80/jpg/image.jpg?timestamp='
Image  = imread(CamURL);
handles.frame1 = image(Image);
guidata(hObject, handles)

% --- Executes on Cam1 timer expiry
function Cam1_NextFrame_Callback(hObject, handles)
Image  = imread(handles.CamURL1);
set(handles.frame1,'CData',Image);
drawnow;

% --- Executes on button press in StartCam1.
function StartCam1_Callback(hObject, eventdata, handles)

handles.timer1 = timer(...
  'ExecutionMode', 'fixedRate', ...   % Run timer repeatedly
  'Period', 1, ...                % Initial period is 1 sec.
  'TimerFcn', {@Cam1_NextFrame_Callback, hObject, handles}); % Specify callback timer.

start(handles.timer1);
guidata(hObject,handles);

注:handlesは、この GUI にアタッチされた guidata オブジェクトです。既に使用しているようです (axes1 用) ので、永続的な GUI の残りの部分をそこに保存します。永続データのアプローチは異なる場合があります。必要に応じて調整します。 gui_init擬似コードです。コンテンツは、裸の MATLAB コードまたは GUIDE で作成された GUI init プレースホルダーのいずれかで、最初に GUI を作成する場所に移動する必要があります。

注 2: camera2 をカット アンド ペーストすると、コードがほぼ同じであることがわかります。これらのハンドル変数の一部を配列として格納することを検討すると、タイマー コールバック関数を再利用できるようになります。カメラのインデックスを渡すだけです。

于 2013-06-13T16:58:32.390 に答える