好 我开始ogre 线程怎么说呢 有个workqueue 初始化时创建几个线程 这些线程监听请求队列和结果队列 请求队列里面有一些请求 线程函数就是不断从其请求队列里弹出一个请求来处理 处理完后把处理结果放结果队列里
主线程会不断查看结果队列处理相应结果
用户需要设置下请求和结果的回调函数 看些例子:
1
WorkQueue* wq = Root::getSingleton().getWorkQueue();
2
mWorkQueueChannel = wq->getChannel("Ogre/TerrainGroup");
3
wq->addRequestHandler(mWorkQueueChannel, this);
4
wq->addResponseHandler(mWorkQueueChannel, this); 第二个参数就是那个继承了回调函数的类 这样 当有请求过来时 就会在后台调用RequestHandler的回调函数 完成后 把结果放
结果队列 主线程检测到后就调用我们设置的回调函数来处理
现在 假如我们要加一个请求 看些例子:
1
WorkQueue::RequestID DefaultWorkQueueBase::addRequest(uint16 channel, uint16 requestType,
2
const Any& rData, uint8 retryCount, bool forceSynchronous) 注意一个channel的参数 在加回调函数和加请求时都有用到 相同channel的请求都会使用那个请求所对应的handlers
如果有多个handlers 那会依次调用 看下代码:
1
for (RequestHandlerList::reverse_iterator j = handlers.rbegin(); j != handlers.rend(); ++j)
2
{
3
// threadsafe call which tests canHandleRequest and calls it if so
4
response = (*j)->handleRequest(r, this);
5
6
if (response)
7
break;
8
}
9
10
Response* handleRequest(const Request* req, const WorkQueue* srcQ)
11
{
12
// Read mutex so that multiple requests can be processed by the
13
// same handler in parallel if required
14
OGRE_LOCK_RW_MUTEX_READ(mRWMutex);
15
Response* response = 0;
16
if (mHandler)
17
{
18
if (mHandler->canHandleRequest(req, srcQ))
19
{
20
response = mHandler->handleRequest(req, srcQ);
21
}
22
}
23
return response;
24
} 每次处理请求之前 会调用canHandleRequest()查看是否能用该handler处理 当然 只要返回一个结果 后续的handler就不处理了
基本上就是这样子 GoodLuck
posted on 2012-11-09 16:01
野猪红 阅读(658)
评论(0) 编辑 收藏 引用 所属分类:
Ogre