async examples added
This commit is contained in:
parent
08abd67519
commit
858121e0dc
|
@ -0,0 +1,43 @@
|
||||||
|
// Async method to run a slow calculation in a background thread.
|
||||||
|
// Build with: valac --thread --pkg=gio-2.0 example.vala
|
||||||
|
|
||||||
|
async double do_calc_in_bg(double val) throws ThreadError {
|
||||||
|
SourceFunc callback = do_calc_in_bg.callback;
|
||||||
|
double[] output = new double[1];
|
||||||
|
|
||||||
|
// Hold reference to closure to keep it from being freed whilst
|
||||||
|
// thread is active.
|
||||||
|
ThreadFunc<void*> run = () => {
|
||||||
|
// Perform a dummy slow calculation.
|
||||||
|
// (Insert real-life time-consuming algorithm here.)
|
||||||
|
double result = 0;
|
||||||
|
for (int a = 0; a<10000000; a++)
|
||||||
|
result += val * a;
|
||||||
|
|
||||||
|
// Pass back result and schedule callback
|
||||||
|
output[0] = result;
|
||||||
|
Idle.add((owned) callback);
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
Thread.create<void*>(run, false);
|
||||||
|
|
||||||
|
// Wait for background thread to schedule our callback
|
||||||
|
yield;
|
||||||
|
return output[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(string[] args) {
|
||||||
|
var loop = new MainLoop();
|
||||||
|
do_calc_in_bg.begin(0.001, (obj, res) => {
|
||||||
|
try {
|
||||||
|
double result = do_calc_in_bg.end(res);
|
||||||
|
stderr.printf(@"Result: $result\n");
|
||||||
|
} catch (ThreadError e) {
|
||||||
|
string msg = e.message;
|
||||||
|
stderr.printf(@"Thread error: $msg\n");
|
||||||
|
}
|
||||||
|
loop.quit();
|
||||||
|
});
|
||||||
|
loop.run();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Build with: valac --pkg=gio-2.0 example.vala
|
||||||
|
|
||||||
|
abstract class Generator<G> {
|
||||||
|
private bool consumed;
|
||||||
|
private unowned G value;
|
||||||
|
private SourceFunc callback;
|
||||||
|
|
||||||
|
public Generator () {
|
||||||
|
helper ();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void helper () {
|
||||||
|
yield generate ();
|
||||||
|
consumed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract async void generate ();
|
||||||
|
|
||||||
|
protected async void feed (G value) {
|
||||||
|
this.value = value;
|
||||||
|
this.callback = feed.callback;
|
||||||
|
yield;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool next () {
|
||||||
|
return !consumed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public G get () {
|
||||||
|
var result = value;
|
||||||
|
callback ();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Generator<G> iterator () {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class IntGenerator : Generator<int> {
|
||||||
|
protected override async void generate () {
|
||||||
|
for (int i=0; i < 10; i++) {
|
||||||
|
if (i%2 ==0) yield feed (i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(string[] args) {
|
||||||
|
var gen = new IntGenerator();
|
||||||
|
|
||||||
|
foreach (var item in gen)
|
||||||
|
stdout.printf(@"Result: $item\n");
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Example with GIO asynchronous methods:
|
||||||
|
// Build with: valac --pkg=gio-2.0 example.vala
|
||||||
|
|
||||||
|
async void list_dir() {
|
||||||
|
var dir = File.new_for_path (Environment.get_home_dir());
|
||||||
|
try {
|
||||||
|
var e = yield dir.enumerate_children_async(
|
||||||
|
FileAttribute.STANDARD_NAME, 0, Priority.DEFAULT, null);
|
||||||
|
while (true) {
|
||||||
|
var files = yield e.next_files_async(
|
||||||
|
10, Priority.DEFAULT, null);
|
||||||
|
if (files == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
foreach (var info in files) {
|
||||||
|
print("%s\n", info.get_name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Error err) {
|
||||||
|
warning("Error: %s\n", err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
var loop = new MainLoop();
|
||||||
|
list_dir.begin((obj, res) => {
|
||||||
|
list_dir.end(res);
|
||||||
|
loop.quit();
|
||||||
|
});
|
||||||
|
loop.run();
|
||||||
|
}
|
|
@ -8,3 +8,7 @@ valac --thread async-queue-test.vala
|
||||||
valac --pkg gio-2.0 dbus-demo-service.vala
|
valac --pkg gio-2.0 dbus-demo-service.vala
|
||||||
|
|
||||||
valac main_loop.vala
|
valac main_loop.vala
|
||||||
|
|
||||||
|
valac --pkg gio-2.0 async_gio_example.vala
|
||||||
|
valac --pkg gio-2.0 async_bg_thread_example.vala
|
||||||
|
valac --pkg gio-2.0 async_generator_example.vala
|
Loading…
Reference in New Issue