C ++中的简单终端进度条(linux终端)

时间:2014-12-09 18:03:10

标签: c++ linux terminal progress-bar

我想在C ++中创建一个打印“Loading ...”的进度条。

点数将显示为每秒一次。

喜欢正在加载> 正在加载。> 正在加载.. > 正在加载......

我怎么能这样做?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用线程每秒更新一次显示。

这是一个嵌入此类的课程:

#include <thread>   // for threads
#include <chrono>   // for expresssing duration
#include <atomic>   
#include <iomanip>
#include <functional>   // for std::ref()
using namespace std; 

class progress_bar {
    atomic<bool> finished; 
    atomic<int> n; 
    thread t;
public: 
    progress_bar() : finished(false),n(0), t(ref(*this)) { }    // initiate the bar by starting a new thread
    void operator() () {                                       // function executed by the thread
        while (!finished) {
            this_thread::sleep_for(chrono::milliseconds(1000));   
            cout << "\rLoading" << setw(++n) << setfill('.') << " "; 
        }
    }
    void terminate() {                                  // tell the thread/bar to stop 
        finished = true;
        if (t.joinable())
            t.join(); 
    }
};

然后,您可以在代码中使用此类:

progress_bar bar;
for (long i = 0; i < 3000000000L; i++);
bar.terminate();    // you can have a delay up to 1 s 

显示是原始的:\r使显示在当前行的开头重新启动。只要您不输出任何其他内容,并且您没有显示的点数比行长度更长。

或者,您可以将其与诅咒答案相结合,以更可靠地将状态写入固定屏幕位置。

答案 1 :(得分:0)

Ncurses库(虽然很古老)能够模仿你刚才所说的。