You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:50