好 我开始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 那会依次调用 看下代码:
1for (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
10Response* 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
野猪红 阅读(654)
评论(0) 编辑 收藏 引用 所属分类:
Ogre