Hi All,

I am trying to update a text box from another thread but it has me stumped right now.

What I am trying to achieve is that the user can Initiate multiple pipeShell and the output from each of those should go into its own Textbox in parallel.

I tried creating the SWT UI Controls inside as well as outside my spawn but since they get added to a single parent Control its getting maddeningly frustrating.

Here is the Code:

    int nextIndex = 1;
    Text[int] statusItems;

public int addStatus(string title, string process = "", int waitFor = 0)
    {
        int idx = nextIndex;
        nextIndex++;
Tid id = spawn(&addStatusImpl, idx, title, process, waitFor);

// tabStatuses = new TabFolder(canvas,SWT.TOP);
        auto statusItem = new Text(tabStatuses);
        auto tabItem = new TabItem(tabStatuses, SWT.NONE);
        send(id, statusItem, tabItem);

        std.concurrency.register(title, id);

        //auto msg = receiveOnly!(int, Text)();
        //statusItems[idx] = msg[1];
        //return msg[0];
        return idx;
    }

static private void addStatusImpl(int idx, string title, string process = "", int waitFor = 0)
    {
        auto msg = receiveOnly!(Text, TabItem)();
        Text item = msg[0];

        //send(idx, item);

        TabItem tabItem = msg[1];
        tabItem.setText(title);
        tabItem.setControl(item);

        if(process.length != 0)
        {
            Text b = statusItems.get(waitFor, null);
            Tid id;
            if(b is null)
                addProcess(item, process, null, null);
            else
addProcess(item, process, b.processPipe.pid(), b.title);
        }
    }

static public void addProcess(Text txtStatus, string command, Pid waitFor, string waitForTitle)
{
    if(waitFor !is null)
    {
        auto blocker = tryWait(waitFor);
        if(!blocker.terminated)
        {
txtStatus.append("Waiting for " ~ waitForTitle ~ "...\n");
            wait(waitFor);
        }
        if(blocker.status != 0)
        {
txtStatus.append("ERROR: Process " ~ waitForTitle ~ " did not finish properly. Terminating Self.\n");
            return;
        }
    }

    string finalCommand = escapeShellCommand(command);
auto pipes = pipeShell(finalCommand, Redirect.all, null, std.process.Config.suppressConsole);
    scope(exit) wait(pipes.pid);

    foreach(str; pipes.stdout.byLine)
    {
        string s = to!string(str);
        txtStatus.append(s);
    }

    foreach(str; pipes.stderr.byLine)
    {
        string s = to!string(str);
        txtStatus.append(s);
    }
}

Can someone please help me with a solution. I am new to D (long term c/c++ programmer) and am probably missing something.

Also any tips to do stuff the "D" way would also be appreciated as you can see that my mind set is still C-style coding.

Thank you all.

Reply via email to