好 我开始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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理