我开发了一个带有多个按钮的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
答案 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进行剪切和粘贴,你会发现代码几乎完全相同。考虑将这些句柄变量中的一些存储为数组,然后您将能够重用计时器回调函数。只需传入相机索引。