讨论 关于如何控制定时器之间的竞争?有多个地方需要向设备输出数据,但同一时间只能向设备发送一个数据.

时间:2021-04-19 23:34:20
问题如下:
程序中有多个地方需要向TV发送字幕显示的数据,如显示音量,显示歌曲信息,滚动字幕等. 
上面三个信息中,他们都有优先级别,显示音量最高,显示歌曲信息次之,滚动字幕最小.

每个信息都需要有一个定时器来控制它们的显示时间(不可能总显示在TV上,比如音量五秒,滚动字幕两分钟等),并且对于显示歌曲信息和滚动字幕,还需要另外一个定时器来控制它们移动.所谓的滚动,是靠不停地移动产生的.那么一个信息,将有可能有两个定时器.

当只有两个的时候(如音量和滚动字母),还比较好操作,大不了,在控制音量的代码段里,直接控制滚动字母的计时器的ENabel属性.这样勉强能实现这个功能,但是,当新增信息时,如显示歌曲,改动就特别大,定时器也变得多了起来,很不好管理.


我现在想到的方法是:
把显示字幕的信息封装到一个类里,(如显示的位置,字体大小,颜色,优先级别等),这个类的主要事件就是显示信息.
当有显示的消息产生时,就实例化这个类, 当它的显示时间到了,则释放掉这个类.

那么,就还需一个类,来管理这些实例,并且协调好它们的优先级别.对于这个类,就不知怎么设计了(实例的个数是不定的)..

请教诸位,有没有好的设计思路?

4 个解决方案

#1


没看明白啊。。。。。。。

#2


简单说来,就是有N个定时器,它们都向电视机发送显示命令.但电视机在一个时间,只能显示一条信息,我必须根据这N个定时器所包含的优先级别,找到一个优先级别最高的发过去,其它的就不理了..
最高的时间到了,就把第二个发过去,依次类推...本质上,就是排队问题.

#3


嗯,还是举例说明吧:
名称      开始时间       持续时间     优先级别           流水号
音量      12:23:40         5 秒           0               1
歌词      12:24:00        10 秒           1               2
字幕      12:24:05        60 秒           2               3
歌词      12:24:15        15 秒           1               4
音量      12:24:20         5 秒           1               5
.....

那么程序响应顺序为:
12:23:40 --- 12:23:45     响应流水号:1 时间: 5秒
12:24:00 --- 12:24:10     响应流水号:2 时间: 10秒
12:24:10 --- 12:24:15     响应流水号:3 时间: 5秒 还差55秒,没办法,别的优先
12:24:15 --- 12:24:20     响应流水号:4 时间: 5秒 还差10秒,没办法,音量优先
12:24:20 --- 12:24:25     响应流水号:5 时间: 5秒 音量响应完毕,返回响应其它事件
12:24:25 --- 12:24:35     响应流水号:4 时间: 10秒 歌词响应完毕,返回响应其它事件
12:24:35 --- 12:25:30     响应流水号:3 时间: 55秒 响应完毕,等待新的任务...

呵呵,上面的例子跟<操作系统>里讲的资源竞争差不多吧..
就是不知道怎样设计,才好一些,要知道,所有的时间,都是用定时器来实现的.所以感觉特麻烦.. 

#4


上面打错了,最后一个音量的优先级别也为:0

#1


没看明白啊。。。。。。。

#2


简单说来,就是有N个定时器,它们都向电视机发送显示命令.但电视机在一个时间,只能显示一条信息,我必须根据这N个定时器所包含的优先级别,找到一个优先级别最高的发过去,其它的就不理了..
最高的时间到了,就把第二个发过去,依次类推...本质上,就是排队问题.

#3


嗯,还是举例说明吧:
名称      开始时间       持续时间     优先级别           流水号
音量      12:23:40         5 秒           0               1
歌词      12:24:00        10 秒           1               2
字幕      12:24:05        60 秒           2               3
歌词      12:24:15        15 秒           1               4
音量      12:24:20         5 秒           1               5
.....

那么程序响应顺序为:
12:23:40 --- 12:23:45     响应流水号:1 时间: 5秒
12:24:00 --- 12:24:10     响应流水号:2 时间: 10秒
12:24:10 --- 12:24:15     响应流水号:3 时间: 5秒 还差55秒,没办法,别的优先
12:24:15 --- 12:24:20     响应流水号:4 时间: 5秒 还差10秒,没办法,音量优先
12:24:20 --- 12:24:25     响应流水号:5 时间: 5秒 音量响应完毕,返回响应其它事件
12:24:25 --- 12:24:35     响应流水号:4 时间: 10秒 歌词响应完毕,返回响应其它事件
12:24:35 --- 12:25:30     响应流水号:3 时间: 55秒 响应完毕,等待新的任务...

呵呵,上面的例子跟<操作系统>里讲的资源竞争差不多吧..
就是不知道怎样设计,才好一些,要知道,所有的时间,都是用定时器来实现的.所以感觉特麻烦.. 

#4


上面打错了,最后一个音量的优先级别也为:0