第19节 实例-显示模型读取进度

致谢

感谢网友提出这个问题。大家有问题也可以在评论区提出,有问必有答。如果涉及商业需求,可以联系作者133-2459-8743。

问题描述

今天有位网友问我怎么获取模型的读取进度。我记得72讲里面有讲过的,我就把代码发给他了。后来抱着负责任的态度我运行了一下,发现在OSG3.6.5版本中代码报错。于是我又重新改变思路写了一个,这个思路更安全。
image.png

功能

读取模型的时候,打印读取百分比。

本节资源

本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹:

【击此打开网盘资源链接】

具体实现

第一步: 先写个读取文件的callback,让readNodeFile的时候调一下我们的callback.
class ReadFileCB : public osgDB::Registry::ReadFileCallback
它是这样被调用的:
osgDB::Registry::instance()->setReadFileCallback(new ReadFileCB);

第二步: 在callback中手动获取读写的插件,然后使用osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);来读取文件,使用rw->readNode(istream);来读取结点。

第三步: 起一个线程,实时的获取istream在整个文件中的位置,来求百分比。下面是线程类,先获取了总长度_length,然后在run里看看当前位置,当读到最后的时候线程退出。

class CRenderingThread : public OpenThreads::Thread
{
public:
    CRenderingThread(osgDB::ifstream* fin) :_fin(fin)
    {
        fin->seekg(0, std::ifstream::end);
        _length = fin->tellg();
        fin->seekg(0, std::ifstream::beg);

    };
    virtual ~CRenderingThread() {};

    virtual void run()
    {
        int pos = _fin->tellg();
        while (pos < _length)
        {
            pos = _fin->tellg();
            std::cout << 100.0*pos / _length<<"%%" << std::endl;
        }
    };

protected:
    osgDB::ifstream* _fin;
    int _length;
};

第四步: 在callback里起线程:

        osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);
        CRenderingThread crt(&istream);
        crt.startThread();
        if (istream)
        {
            std::cout << "Using default format readerwriter" << std::endl;

            osgDB::ReaderWriter::ReadResult rr = rw->readNode(istream);
            while (crt.isRunning()) {}
            return rr;
        }

齐活了,我是不是很厉害。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片