progress

thread safe progress bar and spinner library
git clone git://brookjeynes.dev/bjeynes/progress.git
Log | Files | Refs | README | LICENSE

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 }