您的位置:首页 > 其它

ACE_Task 正常退出及其他

2013-03-28 03:25 127 查看
1.ACE_Task封装了任务,每个任务都含有一或多个线程,以及一个底层消息队列。各个任务通过这些消息队列进行通信。

其主要成员如下:

open():初始化资源

close():释放资源

activate():启动线程,可指定线程的数目

svc():线程的启动位置

putq():放置消息到任务的消息队列中

getq():从任务的消息队列中取出消息

thr_count():返回任务中线程的数目

last_thread():返回任务中将线程计数器从1降为0的线程的ID

备注:任务执行完svc()之后,自动执行close()

2. Task_Demo

class Task_Demo : public ACE_Task<ACE_MT_SYNCH>

{

public:

virtual int open (void *args = 0)

{

activate( THR_NEW_LWP, 1 );

return 0;

}

virtual int close (u_long flags = 0)

{

if ( ACE_OS::thr_equal ( ACE_Thread::self (), this->last_thread () ) )

{

//释放对象

delete this;

}

return 0;

}

virtual int svc (void)

{

return 0;

}

};

3. 正常退出:

通常实现svc()的时候,往往如下

while( 1 )

{

//do something

}

可以作类似如下

while( 1 )

{

//do something

ACE_Time_Value tvTmp = ACE_OS::gettimeofday();

tvTmp += ACE_Time_Value(1); //1秒,时间值可根据实际需求设置

getq(X, &tvTmp); //注意,如果不设置超时,如果之前没有putq,此处会阻塞!

if (X != NULL)

{

break;

}

}

然后在退出前putq一个消息,就OK了 (本人疑问:这么做感觉还不如用事件来的直接些 )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: