多个While循环同时协同工作 - MATLAB GUI

时间:2013-06-13 16:45:10

标签: multithreading matlab parallel-processing

我开发了一个带有多个按钮的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

1 个答案:

答案 0 :(得分: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是伪代码。无论是在第一次创建GUI的地方,内容都必须在裸MATLAB代码或GUIDE创建的GUI初始占位符中。

注意2:如果你对camera2进行剪切和粘贴,你会发现代码几乎完全相同。考虑将这些句柄变量中的一些存储为数组,然后您将能够重用计时器回调函数。只需传入相机索引。