S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

代码的坏味2

Posted on 2008-12-17 20:35 S.l.e!ep.¢% 阅读(1678) 评论(3)  编辑 收藏 引用 所属分类: Design Pattern
线程有两条

线程1. 界面线程(主线程)
线程2. 子线程(数据操作)

线程1 与 线程2 都加了一个锁,用于同步一个共享资源

经过调试,在某千均一发之际,线程2 由于操作慢了一点,这时线程1(界面)便会定死在那里,造成程序无反应

后来,想到解决的方法,就是在线程1.访问共享资源时,也开了一条子线程

于是乎,
在所有的 OnButton1_Click() 事件 都对应着一个 OnButton1_Click_Thread() 的线程函数…… 

Feedback

# re: 代码的坏味2  回复  更多评论   

2008-12-17 21:58 by abettor
线程1开的子线程可以用一个线程(池)来代替,OnButton1_Click()在实现的时候告诉线程池:“上帝,给我来一个线程吧,我要……”

# re: 代码的坏味2  回复  更多评论   

2008-12-17 22:56 by 肥仔
个人感觉搞错了方向,可能的原因有2种
1、死锁,可能性不大,因为并不是每次都不行;
2、工作线程执行了更新界面的操作,且通过调用引用控件的方法来更新的。因为控件方法调用实际上是SendMessage,应该用PostMessage就不会错了。

考虑如下情况:
按下按钮,界面线程执行OnButton,等待工作者线程释放锁;
在同一时刻工作者线程更新界面,因为任何界面更新实际上都是界面线程完成(通过消息队列),如果用的是SendMessage模式,工作者线程必须等待完成才可以走一下步,而等待完成的前提是OnButton完成。

这样就OnButton在等待锁,工作者线程在等待OnButton完成才可以释放锁,无响应了,所以工作者线程更新,应该用PostMessage。

# re: 代码的坏味2  回复  更多评论   

2008-12-17 23:10 by 肥仔
刚刚特意再查了一下资料,找到了一片bbs,转到了我自己的空间,你看看,是不是可能SendMessage死锁
http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html

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