On Thursday, 8 October 2020 at 17:02:55 UTC, Alaindevos wrote:
One thing I want to do is in an eventhandler of a button released event which takes minutes in duration to change the state of the statusbar indicating something is going on. But the statusbar is not redrawn before the evenhandler finishes.

Better would be to start a new thread but D-spwawn-threads can not call member functions of the MainWindow calls so some plumbing with gtk is needed. This thread would coexist with the gtk main eventloop. The GTK docs on this look overwhelmingly complicated at first.

I am typing on my mobile phone, so cannot give you a whole example. Just copied and pasted some existing code of mine. İnherit a Thread class:

module downloadservice;

import core.thread;

import std.stdio;

import appwindow;// your window class

class DownloadService : Thread {
        
@property bool workingProperty() { return is_working; } // read property @property bool workingProperty(bool value) { return is_working = value; } // write property
        
        AppWindow ctx;// access all members of your appwindow
        string itag, path, uuid;
        
this(AppWindow _ctx, string _itag, string _path, string _uuid){
                ctx = _ctx;
                itag = _itag;
                path = _path;
                uuid = _uuid;
                workingProperty = false;
        super(&run);
    }

private:
        bool is_working;

public: 
    void run(){
                
        if(this.workingProperty == false){
                        this.workingProperty = true;
                        
                        this.ctx.yvid.downloadItem(itag, path, uuid);
                        
                        this.workingProperty = false;                   
                }
    }
}

...
// İn your app window class
// You don't have to use a thread pool
pool = new ThreadPool((wkr, ctx){
                        auto worker = cast(DownloadService)wkr;
                        worker.run();
                }, cast(void*)this, 50, false);

Reply via email to