控制台輸出:Running ... [ - ] → Running ... [ \ ] → Running ... [ | ] → Running ... [ / ] 循環切換,彷彿一根木棍在旋轉。
#include
using namespace std;
class Progress {
public:
// iv: 動畫速度(每 iv 次 Do() 切換一幀)
explicit Progress(int iv = 1) : intv(iv), cur(1), itmp(0) {}
// 推進狀態機
void Do() {
if (++itmp > intv) {
itmp = 0;
cur = (cur % 4) + 1; // 1→2→3→4→1
}
}
// 輸出當前幀並回退游標
void Show() const {
switch (cur) {
case 1: cout << '-'; break;
case 2: cout << '\\'; break;
case 3: cout << '|'; break;
case 4: cout << '/'; break;
}
cout << '\b'; // 關鍵:退格覆蓋上一字元
}
private:
int cur; // 當前幀 1~4
int intv; // 速度分母
int itmp; // 計數器
};
int main() {
Progress prg(20); // 每 20 次循環換一幀
cout << "Running ... [ ";
while (true) {
prg.Do();
prg.Show();
// 實際專案中這裡替換為真實任務邏輯
// Sleep(10); // 可選:控制整體刷新頻率
}
return 0;
}
\b:不換行覆蓋同一位置,形成動畫視覺;intv 控制幀率,適應不同耗時任務;iostream,易移植至 Linux/macOS 終端。cout << "\rProgress: " << pct << "% [" << spinner << "]";atomic 保護 cur 或改為無鎖環狀陣列;Show() 改寫為 CWnd::SetWindowText 更新靜態文字控件。