Well, I have been testing with Gtk.ProgressBar, with the set_fraction () method (in progress mode because I can know the amount of work remaining). But I did not get it to work properly.
But I have many things to improve on my application and now I do not want to block me any longer in that. That is why I have replaced it with GLib.Notification, which offers the same result for the user with just a few lines of code: When the parser begins: var notification = new GLib.Notification ("Importando contactos") notification.set_body ("Espera, por favor...") var app = GLib.Application.get_default () app.send_notification ("msg-imp", notification) And when it ends: msg_imp: string = "Se han importado " + num_lin.to_string() + " contactos" notification.set_title ("Importación completada") notification.set_body (msg_imp) app.send_notification ("msg-imp", notification) That works well and is simple. As I am developing this application to learn Genie, when the project is more stable, I will return to work with Gtk.ProgressBar. Thank you all! El 13/03/17 a las 12:15, webie...@gmail.com escribió: > Thank you all, and also private messages. > > I'm working in it. When I get some result I will comment. > > > El 12/03/17 a las 21:34, Chris Daley escribió: >> Hi, >> >> This is a quick example I whipped up which works somewhat along the >> lines as Al suggests. This is one of the times where Vala is more >> expressive than Genie with Closures. >> >> uses Gtk >> >> init >> Gtk.init (ref args) >> var TestGtk = new Ventana() >> TestGtk.show_all() >> Gtk.main() >> >> class Ventana : Window >> >> dialogo : Dialogo >> cb : SourceFunc >> boton: Button >> output : string >> >> init >> // set up the main window >> title = "Genie Async" >> set_default_size (250, 100) >> set_border_width(8) >> window_position = WindowPosition.CENTER >> destroy.connect(Gtk.main_quit) >> // set up the button and connect the callback >> boton = new Button.with_label("Load VCard") >> boton.clicked.connect(open_vcard) >> add(boton) >> >> def open_vcard() >> // show the dialog with the progress bar >> dialogo = new Dialogo(this) >> dialogo.show_all() >> // call the async method with callback >> load_vcard.begin ("filename", end) >> >> // this is the callback from the load_card method >> def end (o : Object?, r : AsyncResult) >> // to get the result of the async method, we call its >> // end method with the AsyncResult parameter >> try >> boton.label = load_vcard.end(r) >> except ex : ThreadError >> boton.label = ex.message >> // close the dialog >> dialogo.destroy() >> >> def async load_vcard(fname : string) : string raises ThreadError >> // we save the callback here because Genie has limited support >> // for closures >> cb = load_vcard.callback >> >> // we create a separate thread for our long running process >> run : ThreadFunc of void* >> run = do_load_vcard >> Thread.create(run, false) >> // we return control to the calling method (open_vcard) >> yield >> // we now return a result from our lengthy process >> // for your application this could be an instance of your >> // vard object created above >> return output >> >> // this is to simulate a lengthy process that we run in a separate thread >> def do_load_vcard () : void* >> var result = 0 >> for var i = 0 to 1000000000 >> result = i >> // we save the result of our lengthy process to the output var >> output = "ran %d times".printf(result) >> // then we add the callback (end) to the MainLoop Idle >> Idle.add((owned)cb) >> return null >> >> >> >> class Dialogo : Dialog >> >> progress_bar: ProgressBar >> >> construct( padre: Window ) >> set_transient_for(padre) >> title = "Espera por favor" >> progress_bar = new ProgressBar() >> get_content_area().add(progress_bar) >> set_modal(true) >> // This causes the ProgressBar to pulse every 60 miliseconds >> Timeout.add(60, pulse) >> >> def pulse () : bool >> progress_bar.pulse() >> return true >> Please let me know if this is clear enough (and any suggestions!) >> Cheers >> Chris D >> >> 2017-03-12 13:22 GMT-07:00 Al Thomas via vala-list >> <vala-list@gnome.org <mailto:vala-list@gnome.org>>: >> >> > ----- Original Message ----- >> >> > From: "webie...@gmail.com <mailto:webie...@gmail.com>" >> <webie...@gmail.com <mailto:webie...@gmail.com>> >> > Sent: Saturday, 11 March 2017, 18:55 >> > Subject: [Vala] Gtk.ProgressBar >> >> > I explain: From a FileChooserDialog is selected and opens the vCard >> > file, and if it is too large it takes a while to analyze and >> import the >> > contacts. At that time I want to open a window or dialog (without >> > buttons) with a Gtk.ProgressBar that shows the progress of the >> > operation. And when the operation is finished, the window / >> dialog is >> > automatically closed. >> >> >> Ideally you would use asynchronous, event based programming in >> Vala/Genie. >> So something like: >> 1. Write an asynchronous process vCard function that runs in a >> background >> thread. I've not figured out the best way of doing this, but >> look at the >> async keyword in Vala and >> https://developer.gnome.org/gio/stable/ch02.html >> <https://developer.gnome.org/gio/stable/ch02.html> >> 2. Write an "app_paused" object that stores two states. The first >> state is >> for a Timeout source >> (https://valadoc.org/glib-2.0/GLib.Timeout.html >> <https://valadoc.org/glib-2.0/GLib.Timeout.html>) that >> will then complete and then the second state is showing a >> spinner dialog. >> This needs a cancel method to cancel the timer or close the >> dialog. >> For a progress bar you would need some kind of signalling, so >> more complex. >> 3. You combine these two by starting the "app_paused" object then >> call >> yield process_vCard(). When the processing is finished the >> code after the >> yield should call the app_paused cancel method. >> It would be nice to find some good examples of this. >> >> > At the moment I have not known how to solve it, and I am using >> > Notify.Notification to report the process, but this requires a new >> > dependency (libnotify) and I prefer to use few dependencies. >> >> >> From https://wiki.gnome.org/HowDoI/GNotification >> <https://wiki.gnome.org/HowDoI/GNotification>: >> "As of GLib 2.39, it is no longer necessary to link against >> libnotify to >> >> create notifications in your application, GIO now provides an API >> for it: >> >> GNotification." >> >> So create a Notification >> (https://valadoc.org/gio-2.0/GLib.Notification.html >> <https://valadoc.org/gio-2.0/GLib.Notification.html>) >> and send it through you GApplication send_notification method ( >> https://valadoc.org/gio-2.0/GLib.Application.send_notification.html >> <https://valadoc.org/gio-2.0/GLib.Application.send_notification.html> >> ) >> >> Good luck with it, >> >> Al >> _______________________________________________ >> vala-list mailing list >> vala-list@gnome.org <mailto:vala-list@gnome.org> >> https://mail.gnome.org/mailman/listinfo/vala-list >> <https://mail.gnome.org/mailman/listinfo/vala-list> >> >> >> >> >> -- >> Chris Daley >> Pacific Northwest >> >> e: chebiza...@gmail.com <mailto:chebiza...@gmail.com> >> w: http://chrisdaley.biz >> m: +1-971-703-9251 >> s: chebizarro >> tw: chebizarro >> tz: PDT >> > > _______________________________________________ vala-list mailing list vala-list@gnome.org https://mail.gnome.org/mailman/listinfo/vala-list