Based on Thread, I managed to do what I intended. I have not yet been able to figure out how to do the same through the Task.

Here in the example, when you click on the Start button, a worker is launched that updates the progress bar.

```d
import dlangui;
import core.thread;
import std.conv;

class MyWorker : Thread {
    private {
        bool _status;
        int _counter;
        Window _window;
    }

    this(Window window) {
        super(&run);
        counter = 1;
        _window = window;
    }

    public void run() {
        _status = true;

        while (_status) {
            _window.executeInUiThread(() {
_window.mainWidget.childById!ProgressBarWidget("progressbar")
                    .progress(_counter * 10);
            });
            _window.update(true);
            _counter++;
            Thread.sleep(3000.msecs);
        }
    }

    public void stop() {
        _status = false;
        _counter = 1;
    }

    public bool status() {
        return _status;
    }
}

class MyWidget : VerticalLayout {
    private {
        Button _btnStart;
        Button _btnStop;
        ProgressBarWidget _progressBar;
        MyWorker _worker;
    }

    this(string id, Window window) {
        super(id);
        styleId = id;

        _worker = new MyWorker(window);

        _btnStart = new Button("btn_start", "Start"d);
        _btnStop = new Button("btn_stop", "Stop"d);
        _progressBar = new ProgressBarWidget("progressbar");
        _progressBar.animationInterval(100);

        _btnStart.click = delegate(Widget src) {

            if (!_worker.status)
                _worker.start;

            return true;
        };

        _btnStop.click = delegate(Widget src) {
            if (_worker.status)
                _worker.stop;

            return true;
        };

        addChild(_btnStart);
        addChild(_btnStop);
        addChild(_progressBar);
    }
}

mixin APP_ENTRY_POINT;

extern (C) int UIAppMain(string[] args) {
        
auto window = Platform.instance.createWindow("Test", null, WindowFlag.Resizable, 480, 480);

    auto root = new MyWidget("my_widget");

    window.mainWidget = root;
    window.show();

    return Platform.instance.enterMessageLoop();
}
```

Do you have any suggestions how to do it more beautifully and not through the Thread? In particular, I would like to see the comments of the dlangui developers (@GrimMaple).

Reply via email to