【问题标题】:Multiple While loops working togther at once - MATLAB GUI多个 While 循环同时协同工作 - MATLAB GUI
【发布时间】:2013-06-13 16:45:10
【问题描述】:

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

【问题讨论】:

  • 为什么需要这样的行为?可能有比两个并发无限循环更好的方法来完成它。

标签: multithreading matlab parallel-processing


【解决方案1】:

不要考虑独立的“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 进行剪切和粘贴,您会发现代码几乎相同。考虑将其中一些句柄变量存储为数组,然后您将能够重用计时器回调函数。只需传入相机索引即可。

【讨论】:

  • 好主意。我用代码片段编辑了问题,如何将您的逻辑应用于此鳕鱼片段?
  • 那么,同样的代码片段适用于 Cam2,我可以开始了吗?另一件事是全局while循环方法怎么样,我该如何解决?谢谢顺便说一句
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 2021-08-28
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多