Moin One of the problems of async methods is that you cannot use the normal sleep method. That's why I wrote a small async sleep method. Maybe there're some concurrency problems, I want to discuss here. Regards, Frederik
using GLib; public async void sleep_async(int timeout, GLib.Cancellable? cancellable = null) { ulong cancel = 0; uint timeout_src = 0; if (cancellable != null) { if (cancellable.is_cancelled ()) return; cancel = cancellable.cancelled.connect (()=>sleep_async.callback()); } timeout_src = Timeout.add(timeout, sleep_async.callback); yield; Source.remove (timeout_src); if (cancel != 0 && ! cancellable.is_cancelled ()) { cancellable.disconnect (cancel); } } public async void test (Cancellable? c) { debug("before"); //sleep 3s yield sleep_async (3000, c); debug("after"); } void main () { var ml = new MainLoop (); var c = new Cancellable (); //c.cancel (); //unowned Thread t1 = Thread.create ( () => {Thread.usleep (2000000); debug ("cancel from thread"); c.cancel ();}, false); unowned Thread t2 = Thread.create ( () => {debug("starting test"); test(c);}, false); //cancel after 1 s Timeout.add (500, ()=> {debug("cancelled");c.cancel ();return false;}); Timeout.add (5000, () => {ml.quit (); debug("quit");return false;}); test (c); ml.run(); }
Attachment:
signature.asc
Description: This is a digitally signed message part