Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573659
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:55:50

1 现象:问题描述
在单元测试中,发现系统无论实际需要发送多少数据到接收者,实际上都只发送一批数据,然后就进入死循环状态。经过两天跟踪,才发现问题所在。
2 关键过程:根本原因分析
系统的处理流程如下:
 
系统的状态有5个:IDLE、INIT、START、PROCESS、FINISH,其中PROCESS状态是发送数据的状态,每次会发送一批数据,数据发送完后进入FINISH状态,然后进入下一轮处理或者结束。
经过长时间走读代码,终于发现问题不是状态机的实现上,而是状态值的定义出了问题。状态值用一个枚举类型来表示:
enum TNotifySenderState
{
    STATE_IDLE      = 0,
    STATE_INIT      = 1,
    STATE_START     = 2,
    STATE_PROCESS   = 3,
    STATE_FINISH      = 3
};
由于上面的STATE_PROCESS和STATE_FINISH的值相同,导致程序的处理不会进入STATE_FINISH状态,永远在STATE_PROCESS状态进行处理,因此出现了死循环。
3 结论:解决方案及效果
解决方案:
将TNotifySenderState类型定义为
enum TNotifySenderState
{
    STATE_IDLE      = 0,
    STATE_INIT      = 1,
    STATE_START     = 2,
    STATE_PROCESS   = 3,
    STATE_FINISH      = 4
};
4 经验总结:预防措施和规范建议
对于枚举类型,如果需要赋值,除非应用需要,要求防止出现枚举常量重复的情况。
5 备注
6 考核点
枚举常量的赋值。
7 试题
下面是使用定义状态机的不同状态,哪种定义方式可能导致程序出现问题?
(1)
enum TNotifySenderState
{
    STATE_IDLE,
    STATE_INIT,
    STATE_START,
    STATE_PROCESS,
    STATE_FINISH
};
(2)
enum TNotifySenderState
{
    STATE_IDLE      = 0,
    STATE_INIT      = 1,
    STATE_START,
    STATE_PROCESS,
    STATE_FINISH
};
(3)
enum TNotifySenderState
{
    STATE_IDLE      = 0,
    STATE_INIT      = 1,
    STATE_START     = 2,
    STATE_PROCESS   = 2,
    STATE_FINISH      = 3
};
(4)
enum TNotifySenderState
{
    STATE_IDLE      = 0,
    STATE_INIT      = 1,
    STATE_START     = 2,
    STATE_PROCESS   = 3,
    STATE_FINISH      = 4
};
答案:(3)
阅读(770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~