楼主: 易怒的炎魔
3941 3

[问答] 利用timer函数做一个matlab多线程程序(例子自选)。 [推广有奖]

  • 0关注
  • 0粉丝

大专生

96%

还不是VIP/贵宾

-

威望
0
论坛币
1084 个
通用积分
2.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
3308 点
帖子
11
精华
0
在线时间
117 小时
注册时间
2015-4-1
最后登录
2022-8-2

66论坛币
利用timer函数做一个matlab多线程程序(例子自选)。

关键词:MATLAB matla atlab time Lab matlab 多线程 程序
沙发
matlab-007 发表于 2016-7-17 18:08:48 |只看作者 |坛友微信交流群
Matlab中Timer的使用

鉴于Matlab 中缺乏多线程机制,使用Timer 无疑是一个很重要的工具,Matlab 中Timer 是一个Java 对象。

(1) Timer 的定义
  t=timer();

  设置属性:
  eg.  set(t,'Name','your_timer_name');

  当然可以一次性设置完成:

  例如:
   TaskTimer=timer(...
   'Name','FebirdTimer',...
   'TimerFcn',@ExecuteTask,...
   'ErrorFcn',@ExecuteError,...
   'Period',1,...
   'ExecutionMode','fixedrate');

  这里TimerFcn 为Timer 执行的函数,后面的‘@ExcuteTask’  就是你定义的函数名


同样ErrorFcn 也是一样。

  Period 为执行周期,ExecutionMode 为执行模式,fixedrate 为固定频率。当然前面所说的都是在这个前提之上。

(2) 关于TimerFcn 的定义

  当以TimerFcn 的定义默认必须有两个参数

function ExcuteTask(obj,eventdata)
  % TODO
end

  其中obj 为执行该函数所对应的timer 对象,eventdata 为事件数据,一般里面为具体时间。

当需要在ExcuteTask 中传入参数的时候,那么Timer 可以这样定义:


那么这时函数定义应该为:
function ExcuteTask(obj,eventdata,var1)
  % TODO
end

其他函数的定义也类似。


(3) 关于UserData

UserData 在Timer 比较有用,因为当时用上面的方法传递参数是,Matlab 只会在第一次传入参数。
所以我们可以在UserData 这个域中保存我们的数据。

例如:
   t=[0];
   lh=plot(t,sin(t),'-');   

   t=timer(...
    'Name','MyTimer',...
    'TimerFcn',@ExecuteTask,...
    'ErrorFcn',@ExecuteError,...
    'Period',1,'TasksToExecute',100,...
    'ExecutionMode','fixedrate');

   ud=struct('linehandle',lh,'count',0);
   set(t,'UserData',ud);
   
  start(t);


   function ExecuteTask(obj,eventdata,UserData) ;
     ud=obj.UserData;
     l=ud.linehandle;
     c=ud.count;
     t=get(l,'XData');
     y=get(l,'YData');
     t=[t c];
     y=[y sin(0.1*c)];
     set(ud.linehandle,'XData',t,'YData',y);
     drawnow; %一般放置在set命令后,用于重构刷新图形。
     ud.count=ud.count+1;
     set(obj,'UserData',ud);
   end

以上给出了一个使用Timer 画图的方法。


(4) 关于Timer 的函数

  1.start();
  2.stop();
  3.timerfind();

eg.删除所有的timer
ts=timerfind;
  if length(ts)>0
    stop(ts);
    delete(ts);
  end

通过Name 查找特定的Timer:
  t=timerfind('Name','FebirdTimer');

例如:

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

tb= timer('Name','ButtonTimer','StartDelay', 4,'Period', 4,'TasksToExecute', 2,...
          'ExecutionMode','fixedRate');  
tb.StartFcn = {'my_callback_fcn', 'My start message'};
tb.StopFcn = { @my_callback_fcn, 'My stop message'};
tb.TimerFcn = @(x,y)disp('Hello World!');
start(tb);

% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

tb=timerfind('Name','ButtonTimer');
if length(tb)>0
   stop(tb);
   delete(tb);
end

function my_callback_fcn(obj, event, string_arg)%传入参数,前两个为默认参数
%其中event.Type为回调函数类型,event.Data为回调函数数据
txt1 = ' event occurred at ';
txt2 = string_arg;
event_type = event.Type;%get type
event_time = datestr(event.Data.time);%get timer period
msg = [event_type txt1 event_time];
disp(msg)
disp(txt2)
end

以上给出了通过GUI button 按钮来控制timer开始和终止的方法。

使用道具

藤椅
zhumuzhishen 发表于 2016-8-23 00:08:52 来自手机 |只看作者 |坛友微信交流群
谢谢分享

使用道具

板凳
duibuqininshur 发表于 2016-8-23 10:01:21 |只看作者 |坛友微信交流群
有时间了可以好好看看

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 17:15