在Windows Embedded CE下进行Native C++开发,一次错误使用多线程的经验教训
2009-12-15 12:52
761 查看
教训
圣诞前都忙于提交版本,编码量大增,平均2,300行,有时候上千行。没有做设计就直接编码,由于都是做一些设备相关的开发,output就是设备的表现,没办法进行单元测试。在做的过程中发现了一个设备挂死的问题,后来查出原因,是我误用线程导致的,面壁思过,blog下来,以此为鉴。有问题的设计
设计很简单,4个类,一个抽象类,两个具体设备类和一个工厂类。Client通过工厂类生成具体设备类的指针,保存到抽象类声明的指针中。通过多态来调用各个具体的设备类的方法。
由于两个设备类都需要用到定时任务,因此,我在抽象类里面生成了一个工作线程,定期调用子类(具体设备类)的多态方法执行任务。我在抽象类的构造函数里面生成线程,在释构函数里面发信号退出线程。问题就在释构的地方,由于抽象类的释构比具体设备类的释构要晚,在子类(具体设备类)已经调用完释构函数(我在子类的释构函数里面删除了对具体设备操作的指针),但是工作线程还没有停止下来,可能还在调用子类的多态方法在执行任务,程序就可能挂死了。
解决方法
建立两个protected的方法,一个用来启动工作线程,一个用来停止工作线程,子类在删除外部设备指针之前先停止工作线程,一切运行正常。composition over inheritance
其实更好的方法是把线程处理和这个类结构解耦,不通过继承的方式来使用多线程处理,而是把线程处理类变成一个子类的一个成员,由子类来控制什么时候使用多线程。继续面壁思过。
相关文章推荐
- 在Windows Mobile和Wince(Windows Embedded CE)下使用.NET Compact Framework进行GPS NMEA data数据分析的开发
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Native C++开发,如何取出当前执行文件的路径和调用模块的路径
- 在Windows Mobile和Wince(Windows Embedded CE)下使用.NET Compact Framework进行GPS NMEA data数据分析的开发
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Native C++开发,如何取出资源文件中的版本信息
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Win32开发,取出窗口句柄的方法
- 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序
- Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Win32开发,取出当前所有运行中进程信息的方法
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Native C++时间函数的运用
- 在Window Embedded CE(Wince)下使用OpenNETCF进行路由表的开发
- 在Windows Mobile和Wince(Windows Embedded CE)下进行WTL开发,如何加入超链接(HyperLink)
- 在Window Embedded CE(Wince)下使用OpenNETCF进行路由表的开发
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth
- 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序
- 如何使用PowerShell提升开发效率(以Windows Embedded CE为例)
- 在Window Embedded CE(Wince)下使用OpenNETCF进行路由表的开发
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth
- [转]在Window Embedded CE(Wince)下使用OpenNETCF进行路由表的开发
- 在Windows Embedded CE开发Native C++时一个继承的误用