截止到2021a版本,matlab不能实现传统意义的多线程,但是可以实现并行计算(doc parallel)、定时器中断,以及利用磁盘映射实现多进程通信(doc memmapfile)
本文标题是有些“文不对题”的,实际上只是便于读者检索到该文章。
对于轻量级的任务,比如在命令行打印一个字符串,绘制一张点数不多的图,可以”模拟“多线程(本质上还是定时器中断)
该板块讲一下timer的基本使用,有底子的建议在matlab中或者浏览器中查阅timer的帮助文档:
1、基本用法
t = timer('BusyMode','queue','ExecutionMode', 'fixedspacing',...
'Period',1/fps, 'TimerFcn', @call_back)
一般设置这几个就可以了,如果需要设置其他的,请自行查阅帮助文档。
(1)‘BusyMode’: 一般选‘queue’,排队执行,这样的话,不至于丢任务。
Character vector or string scalar that indicates action taken when a timer has to execute TimerFcn
before the completion of previous execution of the TimerFcn
. When Running='on'
, BusyMode
is read only. This table summarizes the busy modes.
BusyMode Values |
Behavior if Queue Empty | Behavior if Queue Not Empty | Notes |
---|---|---|---|
'drop' |
Adds task to queue | Drops task | Possible skipping of TimerFcn calls |
'error' |
Adds task to queue | Completes task; throws error specified by ErrorFcn ; stops timer |
Stops timer after completing task in execution queue |
'queue' |
Adds task to queue | Waits for queue to clear, and then enters task in queue | Adjusts Period property to manage tasks in execution queue |
(2)‘Period’:两次回调之间间隔时间;
(3)‘ExecutionMode’:设置下一次回调从什么时候开始,这四个都可能用到,根据需求来。
singleShot:只执行一次;
fixedRate:从上一次回调进入排队开始,经过一个周期,再进入下一次回调;
fixedDelay:经过一个time lag之后,经过一个周期,再进入下一次回调;
fixedSpacing:上一次回调结束之后,经过一个周期,再进入下一次回调;
(4)‘TimerFcn’, @call_back
设置回调函数,这个有点复杂。timer本质上就是一个定时器中断,它通过将任务(call_back)排队执行,它的”回调方式“是根据’ExecutionMode’的设置来确定的,不是传统意义上的同步回调或者异步回调。
所谓多进程操作,就是开多个matlab,通过访问硬盘当中的同一个内存空间,实现多个进程之间的通信,从而做到做进程操作。
用到的关键函数是:memmapfile
这里贴一个我自己做测试时用的demo,看不懂的可以在评论区问,看见了就会回复。
注意:两个进程不能同时访问一块内存空间,否则会报错。
(由于matlab语言在markdown格式下,没有高亮,所以下面的两个代码块是选择的是c语言)
第一个.m文件
% 写入一些数据
myData = (1:10)';
fileID = fopen('records.dat','w');
fwrite(fileID,myData,'double');
fclose(fileID);
% 改变一些数据
while 1
m = memmapfile('records.dat','Format','double','Writable',true) ;
m.Data(1) = m.Data(1)+1;
disp(m.Data);
clear m
pause(1)
end
第二个.m文件
%将内存空间'records.dat'的内容打印出来
while 1
m = memmapfile('records.dat','Format','double','Writable','false') ;
disp(m.Data)
clear m
pause(1)
end