On Friday, 30 April 2021 at 16:36:26 UTC, Ola Fosheim Grøstad wrote:
>I found it interesting that several people want async/await in D. I have only limited experience with async/await, but people seem to be enthusiastic about it.
Maybe it would be cool, but I have no idea how to use it. I'm still using dlangui, and this means it has to be build on top of dlangui event loop, or dlangui moved to new standard, I also had vibe.d/dlangui mixed app as well, where should I put event loop now? The good thing, vibe.d has accounted for this (handle messages function to manually process messages from external event loop).
Same with existing solutions, I kind of want it, but unfortunately limited to something like this copy pasted all over my app...
void handleDrop(string[] files) {
import std.file;
auto paths = files.filter!(exists).array;
paths.each!(path => _images[path] = null);
if (paths.length < 1)
return;
// async, yay
auto loadTask = task!( (path) {
App.instance.onImageLoaded(path, loadImage(path));
})(paths[0]);
loadTask.executeInNewThread();
}
private void onImageLoaded(string path, ColorDrawBuf data) {
_images[path] = data;
setCurrentImage(path);
}
void setCurrentImage(string file) {
_activeImage = file;
// execute on next gui event
imageView.executeInUiThread({
imageView.setImage(_images[file]);
});
// even more async, yay \0/
auto detectorTask = task!((s) {
opencv.run_objectedetector(s);
App.instance.onDetectFinished();
})(detector);
detectorTask.executeInNewThread();
}
private void onDetectFinished() {
dstring text;
foreach(det; detector.detections){
text ~= format!"%s [%s%%] @%s\n"d(det.label, det.accuracy * 100f, det.rect);
}
// update text on next gui event
editBox.executeInUiThread({
editBox.text = text;
imageView.invalidate();
});
}