44 lines
1.3 KiB
Vala
44 lines
1.3 KiB
Vala
// 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();
|
|
}
|
|
|