线程托管对象的方法技术

技术编号:3813088 阅读:241 留言:0更新日期:2012-04-11 18:40
一种线程托管对象的方法,该方法包括如下步骤:步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。利用本发明专利技术通过对象托管,可以在线程结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。

【技术实现步骤摘要】

本专利技术涉及一种托管对象的方法,尤其涉及一种。
技术介绍
进行构件编程时,通过引用计数管理对象的生命周期,当不再使用一个对象时,要 通过调用Release方法释放对对象的引用。但是,在主函数MainO通过return返回时,并不表示这个线程结束,而只是离开 了用户的代码,进入消息循环,如果用户注册了某个对象的回调事件,想获得它的某个事件 通知,那么就必须拿着该对象的一次引用,以保证整个消息循环运行期间这个对象都保持 有效。当消息循环结束之后,线程真正准备退出之时,需要释放对这个对象的引用,可此时 已经离开了用户代码,用户只能想办法注册消息循环结束的回调事件,并在回调函数里释 放该对象。另外,如果某个对象在整个线程运行期间都要被引用,但中间可能会因为运行时 错误而中断退出,那么用户就要在每个退出点释放对象。
技术实现思路
鉴于以上内容,有必要提供一种,通过对象托管,可以在线程 结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不 必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。一种,该方法包括如下步骤步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;及步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放 对象,执行结束。 相较于现有技术,程序员可以借助设置一个线程托管对象链表,对线程中的对象 进行托管,通过托管,当线程结束时,自动释放被托管对象的一次引用。通过线程托管在主 函数MainO方法里托管一个对象,当线程即将结束时自动释放一次引用,用户既不必担心 线程运行期间对象的有效性,也不必费事地找时机释放对象。此外,通过托管来管理对象的生命周期,会在线程结束时自动释放对象,用户就不 必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏 释放的情况,从而减轻用户的负担。附图说明图1是本专利技术较佳实施例的主流程图。图2是图1中步骤S30的细化流程图。图3是图1中步骤S40的细化流程图。 具体实施例方式如图1所示,是本专利技术较佳实施例的流程图。在本较佳实施 例中,首先以如下构建的代码来进行说明用户定义的线程函数代码ECode UserRoutine (…){CFoo New (&pFoo);CObjectReleaseAtThreadQuit(pFoo);Return N0ERR0R ;// 退出}主函数代码ECode ElastosMain (…){IThread氺pThreadCThread::New(&UserRoutine,0, NULL, &pThread) ;// 创建一个新线程 UserRoutinepThread- > Join (INFINITE, NULL) ;// 等待线程结束return N0ERR0R_EXIT ;//直接退出程序}用图1所示的流程描述上述构建的代码。步骤S10 在主函数中创建一个线程。该线程运行用于执行用户定义的线程函 数。具体而言,上述主函数的代码中,首先声明一个线程指针PThread,然后通过创建动 作,即CThread: :New(&UserRoutine,0, NULL, &pThread),创建一个线程,该线程名称为 UserRoutine。步骤S20 执行线程的入口函数,在线程的入口函数中调用线程函数。入口函数的 具体代码如下ECode ThreadEntry (PVoid pParam)//线程的入 口函数{ECode ec =(氺pUserFunc) (pParam);CleanupListO ;//清理线程托管对象链表}。上述代码中ECode ec = UserFunc (pParam)为调用线程函数,其中pParam为参数, 具体而言,在本较佳实施例中,调用的线程函数为UserRoutine ()。步骤S30 将线程函数中的对象指针插入到线程托管对象链表。具体代码如下CObjectReleaseAtThreadQuit (pFoo);通过调用函数ReleaseAtThreadQuit ()将对象指针pFoo插入到线程托管对象链 表。所述插入的步骤在图2中再做详细描述。4步骤S40 当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释 放对象,执行结束。从执行的结果可以看到,通过CObject ReleaseAtThreadQuit (pFoo)调用 ReleaseAtThreadQuitO函数即可将当前线程中的对象进行托管,当线程结束时,会自动调 用被托管的对象指针,并释放对象。在本较佳实施例中,线程函数中被托管的对象是一个构件对象。此外,用户也可以为一个线程中的多个对象进行托管,这些线程托管对象会在线 程结束退出时按照托管顺序的相反顺序被调用执行。在本较佳实施例中,线程UserRoutine 中的对象指针为pFoo,当线程UserRoutine执行完毕时,释放该对象。如图2所示,是图1中步骤S30中将线程函数中的对象指针插入到线程托管对 象链表的细化流程图。线程函数通过调用函数ReleaseAtThreadQuitO将对象指针插 入到托管对象链表,之后执行ReleaseAtThreadQuitO函数。在本较佳实施例中,所述 ReleaseAtThreadQuitO 函数代码如下ECode CObjectReleaseAtThreadQuit (PInterface pObject)CList*pList ;{CThread: :GetTls0bject (TLS_AutoReleaseList, &pList) ;// 从 TLS 上获得线 程托管对象链表If (pList == NULL){pList = new CList ;CThread::SetTlsObject(TLS_AutoReleaseList,pList);}pList-> Insert (pObject);return N0ERR0R ;}用图2所示的流程描述上述构建的代码。步骤S301,声明一个线程托管对象链表的类指针。具体而言,代码为 CList^pList。步骤S302,通过所述声明的类指针创建一个线程托管对象链表的类对象,实现一 个线程托管对象链表。具体而言,代码为pList = new CList。步骤S303,将线程函数中的对象指针插入到线程托管对象链表,即完成了托管线 程函数中的对象。具体而言,代码为pList-> Insert (pObject)。在本较佳实施例中,插入 的线程托管对象指针为PFoo。此外,由于线程函数的对象在第一次托管之后,线程托管对象链表已经存在,当线 程函数需要多个对象被托管时,为保证每个线程中只有一个线程托管对象链表,可以直接 将线程函数中对象指针插入到已经存在的线程托管对象链表中。具体做法为判断线程托 管对象链表是否为空,若不为空,直接将对象指针插入到线程托管对象链表中。具体而言, 代码如下If (pList == NULL) {...}pList- > 本文档来自技高网...

【技术保护点】
一种线程托管对象的方法,其特征在于,该方法包括如下步骤:步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;及步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。

【技术特征摘要】

【专利技术属性】
技术研发人员:宋世军陈榕沈金
申请(专利权)人:上海科泰世纪科技有限公司
类型:发明
国别省市:31[中国|上海]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1