Skip to content

Instantly share code, notes, and snippets.

@gavr123456789
Last active August 15, 2023 20:50
Show Gist options
  • Save gavr123456789/04883b80cc942d2957c517231575b10e to your computer and use it in GitHub Desktop.
Save gavr123456789/04883b80cc942d2957c517231575b10e to your computer and use it in GitHub Desktop.
async GTK 3 4 gui example vala nim
using Gtk;
Button button;
void main (string[] args) {
Gtk.init (ref args);
var window = new Window ();
button = new Button.with_label ("Start counting");
button.clicked.connect (() => {
count.begin();
});
with (window){
title = "Count without blocking the UI";
border_width = 10;
window_position = WindowPosition.CENTER;
set_default_size (350, 70);
destroy.connect (Gtk.main_quit);
child = button;
show_all ();
}
Gtk.main ();
}
async void count(){
for(int i = 0; i < 10000; i++){
button.label = i.to_string();
Idle.add (count.callback);
yield;
}
}
@gavr123456789
Copy link
Author

@naipotato
Copy link

Vala GTK 4 with GThread

Without GAsyncQueue

Gtk.Button button;

void main () {
  Gtk.init ();

  var loop = new MainLoop ();

  button = new Gtk.Button.with_label ("Start counting") {
    margin_top = 10,
    margin_end = 10,
    margin_bottom = 10,
    margin_start = 10
  };

  button.clicked.connect (() => {
    new Thread<void> ("count", count);
  });

  var window = new Gtk.Window () {
    title = "Count without blocking the UI",
    default_width = 350,
    default_height = 70,
    child = button
  };

  window.close_request.connect (() => {
    loop.quit ();
    return true;
  });

  window.show ();

  loop.run ();
}

void count () {
  for (var i = 0; i < 9999; i++) {
    Idle.add (() => {
      button.label = i.to_string ();
      return Source.REMOVE;
    });

    Thread.@yield ();
  }
}
video.mp4

With GAsyncQueue

Gtk.Button button;
AsyncQueue<int?> queue;

void main () {
  Gtk.init ();

  var loop = new MainLoop ();
  queue = new AsyncQueue<int?> ();

  button = new Gtk.Button.with_label ("Start counting") {
    margin_top = 10,
    margin_end = 10,
    margin_bottom = 10,
    margin_start = 10
  };

  button.clicked.connect (() => {
    new Thread<void> ("count", count);
    Timeout.add (1, update_gui);
  });

  var window = new Gtk.Window () {
    title = "Count without blocking the UI",
    default_width = 350,
    default_height = 70,
    child = button
  };

  window.close_request.connect (() => {
    loop.quit ();
    return true;
  });

  window.show ();

  loop.run ();
}

bool update_gui () {
  var count = queue.try_pop ();

  if (count == null)
    return Source.REMOVE;

  button.label = count.to_string ();

  return Source.CONTINUE;
}

void count () {
  for (var i = 0; i < 9999; i++) {
    queue.push (i);
    Thread.@yield ();
  }
}
video.mp4

@Miqueas
Copy link

Miqueas commented Oct 12, 2021

Love this ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment