如何在Matlab中通过独立按钮启停两个独立并行程序?
实现独立启停两个程序的Matlab GUI方案
下面是针对需求的完整实现,分**带并行工具箱(batch)和无并行工具箱(timer)**两种方案,适合Matlab初学者上手:
方案一:使用batch(需要并行计算工具箱)
该方案通过batch函数启动完全独立的后台进程,两个程序互不干扰,也不会阻塞GUI操作。
完整代码:
function commandPrograms % 创建主窗口 fig = figure('Name','程序控制器','Position',[200 200 300 150]); % 初始化进程句柄:保存两个程序的batch对象 prog1_handle = []; prog2_handle = []; % 创建Program 1控制按钮 uicontrol('Parent',fig,'Style','pushbutton',... 'String','启动Program 1','Position',[50 80 200 30],... 'Callback',@(src,evt) toggleProgram(src,evt,1)); % 创建Program 2控制按钮 uicontrol('Parent',fig,'Style','pushbutton',... 'String','启动Program 2','Position',[50 30 200 30],... 'Callback',@(src,evt) toggleProgram(src,evt,2)); % 启停逻辑回调函数 function toggleProgram(src,~,progNum) % 获取当前程序的进程句柄 handle_var = sprintf('prog%d_handle',progNum); current_handle = evalin('caller',handle_var); if isempty(current_handle) || ~current_handle.Running % 启动程序 switch progNum case 1 current_handle = batch(@program1,0,{}); case 2 current_handle = batch(@program2,0,{}); end src.String = sprintf('停止Program %d',progNum); % 更新主工作区的进程句柄 assignin('caller',handle_var,current_handle); else % 停止程序 delete(current_handle); src.String = sprintf('启动Program %d',progNum); assignin('caller',handle_var,[]); end end end % ---------------------- % 替换为你的Program 1逻辑 % ---------------------- function program1() while true disp('Program 1正在运行...'); pause(1); % 检测进程是否被终止,避免僵尸进程 if ~isempty(getCurrentTask) && ~getCurrentTask.Running break; end end disp('Program 1已停止'); end % ---------------------- % 替换为你的Program 2逻辑 % ---------------------- function program2() while true disp('Program 2正在运行...'); pause(1); if ~isempty(getCurrentTask) && ~getCurrentTask.Running break; end end disp('Program 2已停止'); end
关键说明
batch(@func,0,{}):启动独立后台进程运行指定函数,0表示无输出参数,{}表示无输入参数。- 进程状态判断:通过
current_handle.Running检查程序是否在运行,空句柄代表未启动。 - 中断处理:在程序循环中加入
getCurrentTask判断,确保进程被删除时能正常退出。
方案二:使用timer(无需额外工具箱)
如果没有并行计算工具箱,用timer实现后台任务(注意:timer在主线程后台运行,耗时逻辑会阻塞GUI)。
完整代码:
function commandPrograms % 创建主窗口 fig = figure('Name','程序控制器','Position',[200 200 300 150]); % 初始化timer对象 timer1 = []; timer2 = []; % 创建Program 1控制按钮 uicontrol('Parent',fig,'Style','pushbutton',... 'String','启动Program 1','Position',[50 80 200 30],... 'Callback',@(src,evt) toggleTimer(src,evt,1)); % 创建Program 2控制按钮 uicontrol('Parent',fig,'Style','pushbutton',... 'String','启动Program 2','Position',[50 30 200 30],... 'Callback',@(src,evt) toggleTimer(src,evt,2)); % 启停逻辑回调函数 function toggleTimer(src,~,timerNum) timer_var = sprintf('timer%d',timerNum); current_timer = evalin('caller',timer_var); if isempty(current_timer) || ~current_timer.Running % 创建并启动timer,每隔1秒执行一次程序逻辑 current_timer = timer('ExecutionMode','fixedRate',... 'Period',1,'TimerFcn',@(~,~) runProgram(timerNum)); start(current_timer); src.String = sprintf('停止Program %d',timerNum); assignin('caller',timer_var,current_timer); else % 停止并删除timer stop(current_timer); delete(current_timer); src.String = sprintf('启动Program %d',timerNum); assignin('caller',timer_var,[]); end end % 程序逻辑执行函数 function runProgram(progNum) switch progNum case 1 disp('Program 1正在运行...'); % 这里写入你的Program 1逻辑(避免无限循环,timer会定期调用) case 2 disp('Program 2正在运行...'); % 这里写入你的Program 2逻辑 end end end
关键说明
timer的ExecutionMode设为fixedRate,表示每隔Period秒执行一次TimerFcn。- 若需要持续运行的逻辑,将循环拆分为单次执行逻辑,由timer定期触发。
内容的提问来源于stack exchange,提问作者Gad11ng
相关产品推荐
相关产品推荐

