void GxsCommentTreeWidget::loadRequest(const TokenQueue *queue, const TokenRequest &req)
{
	std::cerr << "GxsCommentTreeWidget::loadRequest() UserType: " << req.mUserType;
	std::cerr << std::endl;
		
	if (queue != mTokenQueue)
	{
		std::cerr << "GxsCommentTreeWidget::loadRequest() Queue ERROR";
		std::cerr << std::endl;
		return;
	}
		
	/* now switch on req */
		switch(req.mType)
	{
		
			case TOKENREQ_MSGINFO:
			{
				switch(req.mAnsType)
				{
					case RS_TOKREQ_ANSTYPE_ACK:
						if (req.mUserType == COMMENT_VOTE_ACK)
						{
							acknowledgeVote(req.mToken);
						}
						else
						{
							acknowledgeComment(req.mToken);
						}
						break;
					case RS_TOKREQ_ANSTYPE_DATA:
						loadThread(req.mToken);
						break;
				}
			}
			break;
			default:
					std::cerr << "GxsCommentTreeWidget::loadRequest() UNKNOWN UserType ";
					std::cerr << std::endl;
					break;

	}
}
void loadAllResourcesAsyc(const std::vector<std::string>& resources, const std::function<void(size_t)>& callback)
{
    if (resources.size() == 0) {
        callback(0);
        return;
    }
    struct __Args* args = new __Args();
    std::copy(resources.begin(), resources.end(), std::back_inserter(args->resources));
    args->callback = callback;
    args->size_res = args->resources.size();
    args->size_textures = 0;
    
    /*将pvr或png分离出来单独加载*/
    args->bound = std::partition(args->resources.begin(), args->resources.end(), [args](/*typename _ResArr::value_type&*/std::string& value)->bool{
        if(value.find("pvr")!=-1 || value.find("png")!=-1){
            ++args->size_textures;
            return true;
        }
        else
            return false;
    });
    /*等纹理加载完毕,再加载其他资源
     另外再开一个线程加载*/
    std::thread loadThread(&_asyncLoadThreadFunc, args);
    loadThread.detach();
    /*因为必须在主线程将纹理加载进入显存,所以可以用cocos2d-x异步加载函数*/
    auto textureCache = cocos2d::Director::getInstance()->getTextureCache();
    for (auto it=args->resources.begin(); it!=args->bound; ++it)
    {
        cocos2d::log("load texture image: %s",it->c_str());
        textureCache->addImageAsync(*it, [args](cocos2d::Texture2D *){
            args->callback(--args->size_res);
            --args->size_textures;
            if (args->size_textures == 0) {
                args->cv.notify_one();
            }
            if (args->size_res == 0) {
                delete args;
            }
        });
    }
}
void StreamService::operator()()
{
	Thread loadThread("Loader");
	loadThread.startThread(std::ref(loader));

	currentBuffer = &streamBufferA;

	UInt32 bufferOffset = 0;
	loader.ReadyForData();
	InitialDataMove(bufferOffset);
	StartProcessing();

	while (IsStreaming())
	{
		coordCV.wait(lock);

		StreamBuffer* currBuff = GetActiveBuffer();
		
		musicRef->PushData(currBuff, ByteSubmissionAmount, bufferOffset);

		bufferOffset += ByteSubmissionAmount;

		if (bufferOffset >= currBuff->numBytesInBuffer)
		{
			if (LastBuffer)
			{
				musicRef->StopProcessing();
				SetStreaming(FALSE);
			}
			currBuff->hasData = FALSE;
			SwapActiveBuffer();
			bufferOffset = 0;
			loader.ReadyForData();
		}
	}

	loadThread.join();

	streamer->StreamEnded(this);
}