处理定时器排队冲突

在繁忙时间,在多次执行方案中,计时器可能需要添加计时器回调函数(TimerFcn)到MATLAB®回调函数的先前排队的执行之前执行队列已完成。您可以确定计时器对象通过设置如何处理这种情况BusyMode物业使用这些模式中的一种:

点模式(默认)

如果您指定'下降'为一体的值BusyMode属性,计时器对象将定时器回调函数来执行队列仅当队列是空的。如果执行队列不为空,则定时器对象跳过回调的执行。

例如,假设你创建具有周期1秒的计时器,但是这需要至少为1.6秒的回调,如这里所示出mytimer.m

功能mytimer()T =定时器;t.Period = 1;t.ExecutionMode = '固定利率';t.TimerFcn = @mytimer_cb;t.BusyMode = '下降';t.TasksToExecute = 5;t.UserData =抽动;开始(t)的函数结束mytimer_cb(H,〜)timeStart = TOC(h.UserData)暂停(1.6);timeEnd = TOC(h.UserData)端

下表描述了计时器如何管理执行队列。

大约经过时间(秒)

行动

0

开始回调的第一个执行。

1

尝试启动回调的第二次执行。第一次执行没有完成,但执行队列为空。计时器增加了回调到队列中。

1.6

完成第一个回调的执行,并启动第二。这个动作清除执行队列。

2

尝试启动第三回调执行。第二个执行没有完成,但队列为空。计时器增加了回调到队列中。

3

尝试启动第四回调执行。第三回调是在执行队列中,因此定时器丢弃此执行的功能。

3.2

完成第二个回调,并启动第三,清理执行队列。

4

再掀回调执行。因为队列为空,则计时器增加了回调到队列中。这是第五次尝试,但只有第四个实例将运行。

4.8

完成第三个执行并启动第四个实例,清除队列。

再掀回调。实例运行,但执行队列为空,所以计时器将其添加到队列中。这是第五个实例将运行。

6

什么都不做:值了TasksToExecute属性,第五实例运行在队列中。

6.4

完成第四回调执行和开始第五。

8

完成第五回调执行。

错误模式

'错误'模式为BusyMode属性是类似'下降'模式:在这两种模式中,定时器只允许一个在执行队列中的回调的实例。然而,在'错误'模式,当队列不为空,定时器调用函数您指定使用ErrorFcn属性,然后停止处理。当前运行的回调函数完成,但在队列中的回调不执行。

例如,修改mytimer.m(在上一节中所描述),使得它包括一个错误处理功能和集BusyMode'错误'

功能mytimer()T =定时器;t.Period = 1;t.ExecutionMode = '固定利率';t.TimerFcn = @mytimer_cb;t.ErrorFcn = @myerror;t.BusyMode = '错误';t.TasksToExecute = 5;t.UserData =抽动;开始(t)的函数结束mytimer_cb(H,〜)timeStart = TOC(h.UserData)暂停(1.6);timeEnd = TOC(h.UserData)端功能myerror(H,〜)DISP( '达到误差函数')端

下表描述了计时器如何管理执行队列。

大约经过时间(秒)

行动

0

开始回调的第一个执行。

1

尝试启动回调的第二次执行。第一次执行没有完成,但执行队列为空。计时器增加了回调到队列中。

1.6

完成第一个回调的执行,并启动第二。这个动作清除执行队列。

2

尝试启动第三回调执行。第二个执行没有完成,但队列为空。计时器增加了回调到队列中。

3

尝试启动第四回调执行。第三回调是在执行队列中。计时器不会执行第三回调,而是调用错误处理功能。

3.2

完成第二回调并启动错误处理功能。

队列模式

如果您指定'队列'时,定时器对象等待直到排队计时器回调函数的下一次执行之前当前正在执行的回调函数饰面。

'队列'模式中,定时器对象试图使平均时间之间执行等于在指定的时间量属性。如果计时器对象必须等待更长的时间比规定的时间计时器回调函数的执行之间的财产,它缩短了后续执行,以弥补时间的时间段。

也可以看看

相关话题