前言
之所以写这篇文章是为了纪念以及总结我的第一个基于c++的软件架构的完成。尽管该架构简单的实现了一个基于multi-thread的event engine,timer定时机能,基础的多进程通信库的封装。与我而言是个人技术发展道路上的一个里程碑;同时于一些有志学习软件架构的后辈作为一个参考吧。
在此,本人的架构并没有任何抄袭任何人的地方,完全是自己根据对c++的理解以及工作中的经验实验而成。因此,该作品的知识产权完全属于我个人,任何企业,组织,个人,其他的机构不得随意使用本架构的思想谋取利益,一旦被本人发现将诉诸法律武器保护我的权利。至于,使用本人思想学习知识的同仁,本人热烈欢迎!任何对本人的作品有良好建议的,可以与本人联系,大家可以一起交流学习!
下面简单介绍一下我的作品。这个架构采用的编程语言是c++,自然也就使用了O-O的编程思想同时也使用了一些较为常用的设计模式以达到代码的通用性和可靠性。
该架构是采用VC6.0搭建的也就是说目前可以正常运行与win32平台下。此处本人会给出架构的核心代码以及实现思想,一些细枝末节本人不会过分强调。该架构采用multi-thread机制可以高效的利用CPU完成工作。针对于线程与c++的矛盾我采了一个方法将二者统一起来;为了实现动态创建线程,实现了一个thread manager完成这一个任务;timer是event engine最重要的机能之一,我实现了一个多线程的timer可以完成相对精确的定时功能,如需要更加精确的定时则必须通过硬件实现。
为了实现多个进程之间的高效通信,我封装了一个通信库。该通信机制采用了share memory由于我的架构是针对嵌入式系统的,因此,尽管share memory比较难于使用,我还是实现了一个较好的封装。
下面,入正题。
(一)c++与thread共存
了解c++的朋友应该知道c++与thread并不能简单的共存,这个也是反对c++的人攻击c++的好借口。在此,我们不讨论他的好处坏处。由于c++的“动态”特性与thread的“静态”特性相矛盾,我们在实现的时候必须采用一点技巧,下面就介绍一下我的处理思想。
c++虽然以动态为主并没有将静态特性完全去除,我们可以利用这一点解决问题。c++中static这个关键字的作用在此体现出来了。
首先封装一个线程class将线程相关的操作统统封装在这个class里面,线程相关的系统调用无法与this指针共处于是我封装一个static的接口以解决this的问题这个class的封装如下:
class cESThread:virtual public cESObject
{
friend class cESThreadManager;用于线程管理器访问线程
public:
virtual ~cESThread(){}
private:
virtual void thread_function(void) = 0;线程函数
public:
/*
* start_thread() is as execute() method
*/
HANDLE start_thread(char* p_nam = "Raw thread!",
INT32 pri = THREAD_PRIORITY_NORMAL,
LPSECURITY_ATTRIBUTES herit_bychild = NULL,
DWD32 stack_size = 0,
DWD32 start_state = 0)该函数可以完成线程的创建启动过程
{
#ifdef WINDOWS_H
p_handle = CreateThread(herit_bychild,
stack_size, run, this,
start_state, &thread_id);
set_priority(pri);
#endif
return p_handle;
}
void stop_thread(void){
//CloseHandle(p_handle);
}
void terminate(void){ }终止线程
bool join(unsigned int m_sec);连接线程
bool check_quit();检查线程的状态
char* get_nam(){ return thread_nam; }
inline int get_priority(void)const volatile{ return thread_priority; }
inline void set_priority(int pr){
if (p_handle)
SetThreadPriority(p_handle, pr);
return;
}
inline HANDLE get_handle(void){ return p_handle; }
protected:
我们在这个static的run方法里解决了线程与c++的矛盾!!
技巧比较强一点!
static DWORD WINAPI run(void* p){
static_cast
(p)->thread_function();
return 0;
}
HANDLE p_handle;
char thread_nam[NAME_SIZE];
volatile int thread_priority;
DWORD thread_id;
};
阅读(2201) | 评论(0) | 转发(0) |