On Friday, 23 June 2023 at 23:37:29 UTC, Vinod K Chandran wrote:
Hi all,

Hi, I found the solution by myself. We can use Pipe struct for this job.
Here is the code looks like. This is for future readers.

```d
void onBtnBurnClick(Control c, EventArgs e) { // A button click event handler
        if (!jobStarted) {
                jobStarted = true;
                btnBurn.text = "Stop the job";
                string cmd = makeCommand();
                ff = spawn(&runInAnotherThread, cmd); // ff is global var
        } else {
                ff.send(-1); // Send a signal to stop the job
                btnBurn.text = "Start the job";
        }
}

void runInAnotherThread(string cmd) {
        Duration du = dur!"hnsecs"(-2); // Minus value for no waiting
        auto psin = pipe();
        auto psout = pipe();
        auto pserr = pipe();
spawnShell(cmd, psin.readEnd, psout.writeEnd, pserr.writeEnd , null, Config.detached);
        string line;
    while ((line = pserr.readEnd.readln()) !is null){
receiveTimeout(du, (int dummy) {psin.writeEnd.writeln("q"); psin.writeEnd.flush(); }); // Here, entering "q" is app specific command to stop.
                writefln("pipe err: %s", line);
                stdout.flush;
        }
}
```
By this way, you can asynchronously process the output from the child process.

Reply via email to