最近在开发一套新产品,测试中发现了一些UI奔溃,自己在设计模块通讯接口方面考虑不周全,在此做一下记录。
需求:
两个模块,UI调度模块以及实际功能模块。UI调度模块需要调用功能模块,获取数据,显示在UI上面。
//
之前的做法:
1.在功能模块,数据放在一个全局的list或者vector中,导出list或vector指针,供UI调度模块使用。
2.UI调度模块,提供一个全局指针用于存放传递过来的数据.
导致的问题:
UI调度模块频繁调度功能模块,功能模块里面的数据,增加或者删除,调度模块存放的数据就会乱,这样就会导致访问越界等问题,程序奔溃。
归根到底,还是数据的同步问题没有做好。
//
//
现在的做法:
1.list或者vector内存的申请以及释放,统一由UI调度模块提供。功能模块只填充数据,接口里提供UI调用模块list或者vector的指针即可。
2.UI调度模块,在所有增加或删除数据的地方,加锁。
这样再怎么重复调用,怎么刷新都不会异常了
//
//@2017.7.26
继续跟新,这样调用在相同的编辑器下,是可以的。但是如果功能模块使用vs2017开发的,ui调度模块使用的vs2010,就会导致堆栈异常。
终极解决方案:
不使用list或者vector传参,改为数组指针即可,内部用list或者vector实现。
分析:
list或者vector,都是模板,不同的编译器,内部实现应该有所差距。比如vs2010对C11支持的不是很好,智能指针,std::thread,数组的默认构造,都不支持。
扩展:
设计导出接口时,不使用模板类,比如string、cstring、vector、list等等,使用基本类型,比如wchar_t*,数组指针等等,这样兼容性更好。