ogre 中的线程 workqueue

ogre 中的线程 workqueue
好 我开始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

你可能感兴趣的:(ogre 中的线程 workqueue)