0

我开发了一个带有多个按钮的 MATLAB GUI。每个按钮都开始执行一个无限循环。当我按下一个按钮时,while 循环执行得很好,但是当我按下下一个按钮时,第一个停止,下一个开始,我需要的是所有 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”循环,不如考虑一个可选择执行许多子功能的大循环。

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

一直运行此循环,从您打开 GUI 时开始,并在 GUI 关闭时退出。

或者,考虑使用计时器。当您按下按钮时,启动一个计时器,它将执行一个回调函数,该函数应该执行一次 while 循环的迭代。每个按钮使用一个计时器,因此它们可以独立启动和停止。这具有能够控制执行率的额外优势。

编辑:采用计时器方法,仅列出一台摄像机。另一个是一样的。

% 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 回答