在matlab函数中同时启动2个计时器

eh57zj3b  于 2023-01-31  发布在  Matlab
关注(0)|答案(1)|浏览(309)

我有一个程序有2个定时器函数,如下所示(p_maj_inputp_maj_output_motion相等,因此两个定时器的周期相同):

maj_input = timer('ExecutionMode','fixedRate','Period',p_maj_input,'TasksToExecute', ...
    floor(Tmeasurement/p_maj_input)-1,'TimerFcn',{@time_append,p_maj_input,HR_all,freq_HR, ...
    BVP_all,freq_BVP,TEMP_all,freq_TEMP,ACC_x_all,ACC_y_all,ACC_z_all,freq_ACC,EDA_all,freq_EDA, ...
    folder_all,all_dir,num_dir}); start(maj_input);

maj_output_motion=timer('ExecutionMode','fixedRate','Period',p_maj_output_motion,'TasksToExecute', ...
    floor(Tmeasurement/p_maj_output_motion)-1,'TimerFcn',{@output_motion_append, ...
    freq_MOTION,freq_mvt_score,freq_walk,p_maj_output_motion,p_maj_output_walk,folder_all,all_dir,num_dir});%,'StartDelay',min(5,p_maj_output_motion)); %startDelay must be min 5 for walk detection start(maj_output_motion);

在每个定时器回调函数中,都有一个在程序开始时选定的文件夹中包含的子文件夹的循环。

output_motion_append(obj,event,freq_MOTION,freq_mvt_score,freq_walk,p_maj_output_motion,p_maj_output_walk,folder_all,all_dir,num_dir)
    fprintf('motion %d\n',obj.TasksExecuted)
    toc
    for folder_index=1:num_dir
        [folder_original,folder_fictive] = subfolderFunction(all_dir, folder_all, folder_index);
        fileName=strcat(folder_fictive,'\ACC.csv');
        [ACC_time, ACC_x, ACC_y, ACC_z] = loadValuesE4_acc(fileName);
       
% Motion Amount        
        [agitation,agitation_ts] = identifyAgitation(ACC_x,ACC_y,ACC_z,ACC_time);
        agitation=agitation';

        len1=length(agitation);
        if len1<=freq_MOTION*p_maj_output_motion
            i_init1=1;
        elseif len1>freq_MOTION*p_maj_output_motion
            i_init1=len1-freq_MOTION*p_maj_output_motion+1;
        end
        
        writematrix([agitation(i_init1:len1)],strcat(folder_fictive,'\MOTION_output.csv'),'WriteMode','Append');
        
     writematrix([mvt_score(i_init2:len2)],strcat(folder_fictive,'\neurologicScore_output.csv'),'WriteMode','Append');

    end
    
end

如果子文件夹的数量小于4,则一切正常:正确的值出现在执行writematrix函数的文件中。计时器回调函数是一个接一个调用的,因此两个计时器同时工作。但是,如果有5个或更多子文件夹,则不是正确的值,使用调试时我注意到第一个回调函数触发了“TasksToExecute”的数量,然后好像只有第二个回调函数被调用了,也就是说两个定时器不是同时工作的。
我已经尝试增加p_maj_inputp_maj_output_motion,看看问题是否是matlab无法在调用另一个计时器回调函数之前完成运行,但对于5个子文件夹,我仍然遇到相同的问题。
有人知道我的问题出在哪里吗?

jqjz2hbq

jqjz2hbq1#

发生此行为的原因是,一个计时器在再次触发时尚未完成执行,因此第二个计时器在第一个计时器完成之前永远没有机会执行。如果将ExecutionMode从“fixedRate”更改为“fixedSpacing”,则可以保证第二个计时器有时间执行。

function duelingTimers()
disp('With ExecutionMode = fixedRate')
t1 = timer('ExecutionMode','fixedRate','Period',0.1,'TasksToExecute',5,'TimerFcn',@timerFcn1);
t2 = timer('ExecutionMode','fixedRate','Period',0.1,'TasksToExecute',5,'TimerFcn',@timerFcn2);
cleanup = onCleanup(@()delete([t1,t2]));

    function timerFcn1(~,~)
        pause(0.2)
        disp('Timer 1');
    end
    function timerFcn2(~,~)
        pause(0.2)
        disp('Timer 2');
    end

start(t1),start(t2)

wait(t1)
wait(t2)

disp(newline)
disp('With ExecutionMode = fixedSpacing')
t1.ExecutionMode = 'fixedSpacing';
t2.ExecutionMode = 'fixedSpacing';

start(t1),start(t2)

wait(t1)
wait(t2)
end

相关问题