matlab的多线程操作先导知识
一、结论二、定时器timer三、多进程操作 先导知识听说过:定时器中断、线程、进程知道:matlab的帮助文档使用方式,如:doc memmapfile、help memmapfile理解:回调函数,同步回调、异步回调(不知道也没关系,csdn里面很多人都写了这个)一、结论截止到2021a版本,matlab不能实现传统意义的多线程,但是可以实现并行计算(doc parallel)、定时器中断,以及利用磁盘映射实现多进程通信(doc memmapfile)本文标题是有些“文不对题”的,实际上只是便于读者检索到该文章。
二、定时器timer对于轻量级的任务,比如在命令行打印一个字符串,绘制一张点数不多的图,可以”模拟“多线程(本质上还是定时器中断)该板块讲一下timer的基本使用,有底子的建议在matlab中或者浏览器中查阅timer的帮助文档:1、基本用法登录后复制 t = timer('BusyMode','queue','ExecutionMode', 'fixedspacing',... 'Period',1/fps, 'TimerFcn', @call_back)1.2.一般设置这几个就可以了,如果需要设置其他的,请自行查阅帮助文档。
(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 ValuesBehavior if Queue EmptyBehavior if Queue Not EmptyNotes'drop'Adds task to queueDrops taskPossible skipping of TimerFcn calls'error'Adds task to queueCompletes task; throws error specified by ErrorFcn; stops timerStops timer after completing task in execution queue'queue'Adds task to queueWaits for queue to clear, and then enters task in queueAdjusts 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) end1.2.3.4.5.6.7.8.9.10.11.12.13.第二个.m文件登录后复制 %将内存空间'records.dat'的内容打印出来 while 1 m = memmapfile('records.dat','Format','double','Writable','false') ; disp(m.Data) clear m pause(1) end1.2.3.4.5.6.7.
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删