multibar.zig (1590B)
1 const std = @import("std"); 2 const progress = @import("progress"); 3 const MultiBar = progress.MultiBar.MultiBar; 4 5 pub fn threadWorker(manager: *MultiBar, index: usize, seed: usize) !void { 6 var rand_impl = std.Random.DefaultPrng.init(seed); 7 const delay = @mod(rand_impl.random().int(i64), 100) + 20; 8 9 const pb = try manager.bar(index); 10 11 while (!pb.isFinished()) { 12 pb.add(1); 13 try manager.render(); 14 15 try std.Io.sleep(manager.writer.io, std.Io.Duration.fromMilliseconds(delay), .awake); 16 } 17 } 18 19 pub fn main(init: std.process.Init) !void { 20 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); 21 defer arena.deinit(); 22 const allocator = arena.allocator(); 23 24 var stdout_buf: [4096]u8 = undefined; 25 var stdout_writer = std.Io.File.stdout().writer(init.io, &stdout_buf); 26 27 var manager = MultiBar.init(allocator, &stdout_writer); 28 defer manager.deinit(); 29 30 const num_bars = 5; 31 32 for (0..num_bars) |i| { 33 var buf: [32]u8 = undefined; 34 const temp_desc = try std.fmt.bufPrint(&buf, "Task {d}", .{i + 1}); 35 const desc = try allocator.dupe(u8, temp_desc); 36 37 _ = try manager.addBar(100, .{ 38 .description = desc, 39 .show_percentage = true, 40 .write_newline_on_finish = false, 41 .clear_on_finish = false, 42 }); 43 } 44 45 var threads: [num_bars]std.Thread = undefined; 46 for (0..num_bars) |i| { 47 threads[i] = try std.Thread.spawn(.{}, threadWorker, .{ &manager, i, i * 100 }); 48 } 49 50 for (threads) |thread| { 51 thread.join(); 52 } 53 }