有客户我反映,使用生产者和消费者结构,当由于其他进程导致CPU占用率很高,消费者结构存储数据时会发生要存储的数据丢失。用户的描述是“当程序在后台运行,我做其他的LabVIEW编程、调试时,就会不定时碰到消费者循环耗时从理论的50ms跳到200ms左右,而且有的时候过很长时间能够再变成50ms,有的时候变不回来了。”我一直没有再现这个错误。我做的时候,一直是用的两个WHILE循环+wait定时。
昨天晚上在酒店里面,偶然把生产者循环用Timed Loop来做,消费者循环仍用WHILE来做,终于碰到了用户所说的症状。程序框图如图1。
图1 会出错消费者/生产者的程序框图
当没有其他进程占用高CPU时,运行正常,如图2
图2 红色框中消费者循环耗时50ms,与生产者循环耗时相吻合
我再开启另一个极占用CPU资源的VI并运行时,显示如图3。
图3 消费者循环耗时已经到了一千多毫秒的级别了
再去检查保存的数据库,数据库中时间属性仍然是间隔50ms一条记录,往下拖动滚动条,突然发现,有大概十秒钟数据被丢失了!如图4
图4 红框中时间的跨度达五秒钟;具体丢失数据长度还与其他进程占用CPU资源、时间有关
当我把消费者循环也换成Timed Loop时,问题解决。仔细检查数据库中的纪录,没有发生数据丢失的现象。框图如图5
图5 更换循环结构后,不再出现数据丢失的问题。
但奇怪的时,我之前用两个while循环,在生产者循环中使用wait进行定时的时候,并没有这样的问题出现。仔细检查数据库中的纪录,也只少保存了大约1%的数据,不存在像图4那样长达几秒的数据被丢失。而这时我可以理解为是由于wait定时不准确的本质特性造成的。图1的程序发生这样的问题,我实在不知道怎么解释。。。。。。。。
经过刚刚的再次实验,使用两个while循环,也会发生数据丢失的现象。但表现是每秒保存数据从理想20次降低到十几次,且能够等到CPU占用率不高的时候能够恢复到理想值;而不是直接把长达几秒钟的数据丢失。
之前没有发生数据丢失的现象是因为其他进程占用的CPU资源不够多。汗-_-##看来以后写程序还是要多进行极端情况下的测试,尤其是用LabVIEW写程序的时候。。。
11-20晚,T302火车上
近期评论