天下

记录修行的印记

用volatile实现状态机的一点想法


线程A:运行在主界面,可以进入管理界面,进行日常的操作,
比如说登记用户,导入导出用户,产生验证记录!恢复出厂设置!

线程B:运行一个socket客户端任务,
1.将A线程产生的数据上传至服务器!
2.接受并处理来自服务端的命令/请求!,如,设置用户,清除数据,清除验证记录等.

典型的思路,在处理用户数据的时候,就用Mutex锁就可以!

在这里尝试用两个volatile变量处理,处理各种状态机!

volatile bool bDeviceBusy = false; //设备是否忙!
volatile bool bInManagerMenu = false; //是否在管理菜单中

void SetDeviceBusy(bool bBusy);
void SetInManagerMenu(bool bBusy);

场景1:
1.线程B如要设置用户数据,可以先锁定设备SetDeviceBusy(true),视情况可考虑并sleep(n)一下.
2.线程A在主界面的循环中,判断bDeviceBusy的值,如果为true,则在主界面上显示"工作中...",并且锁定设备,不能进入其他任何操作!
3.线程B设置用户数据完成之后,调用SetDeviceBusy(false),
4.线程A在主界面的循环中,判断bDeviceBusy的值,如果为false,解锁设备,使设备正常工作!

场景2:
1.线程A进入了管理菜单,进行用户数据的设置,如,恢复出厂设置时,可以先SetInManagerMenu(true)
2.线程B在线程的循环中,判断bInManagerMenu的值,如果为true,则不处理大部分的事务,如果有网络命令,直接应答设备忙.
3.线程A操作完成之后,调用SetInManagerMenu(false),
4.线程B在线程的循环中,判断bInManagerMenu的值,如果为false,继续处理来自服务端的命令/请求!


优化方案:
通过一个变量的状态来实现.
//volatile int device_status = -1;

posted on 2013-02-26 17:03 天下 阅读(202) 评论(0)  编辑 收藏 引用 所属分类: Linux编程


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年2月>
272829303112
3456789
10111213141516
17181920212223
242526272812
3456789

导航

统计

常用链接

留言簿(4)

随笔分类(377)

随笔档案(327)

链接

最新随笔

搜索

最新评论