使用D控制交互过程

时间:2016-01-09 10:53:44

标签: d

我有一个程序等待一行标准输入,然后,在处理它(需要相当长的时间)后,会发出一个答案。程序将接受输入,直到输入流关闭。

我怎样才能从D控制该程序?换句话说,我怎么能

  1. 为子进程提供一系列标准输入。
  2. 等待子进程回答。
  3. 重复一遍,直到我用尽了我想给它的输入。
  4. 我尝试了以下代码,但不出意外,它等待子进程完全完成,然后一次打印输出:

    module main;
    
    import std.file;
    import std.path;
    import std.process;
    import std.stdio;
    
    void main(string[] args)
    {
        string[] inputs = ["test string 1", "test string 2"];
    
        auto pipes = pipeProcess(buildPath(getcwd(), "LittleTextProcessingApp"), Redirect.all);
        scope(exit) wait(pipes.pid);
    
        foreach(input; inputs)
        {
            pipes.stdin.writeln(input);
        }
        pipes.stdin.close;
    
        foreach(line; pipes.stdout.byLine)
        {
            writeln(line);
        }
    }
    

    也就是说,它在延迟一秒后打印

      

    以下是500毫秒前输入的:测试字符串1
        以下是500毫秒前输入的:test string 2

    所需的行为是打印

      

    以下是500毫秒前输入的:测试字符串1

    半秒后,第二行500毫秒后。

    我作为子进程测试的程序的源代码如下:

    module main;
    
    import std.stdio;
    import core.thread;
    
    void main(string[] args)
    {
        foreach(input; stdin.byLine)
        {
            auto duration = 500.msecs;
            stderr.writefln("Doing something for %s....", duration);
            Thread.sleep(duration);
            writefln("The following was input %s ago: %s", duration, input);
        }
    }
    

1 个答案:

答案 0 :(得分:4)

罪魁祸首是儿童过程。 在<div style="width:100%;height:200px;background-color:yellow" onclick="alert('Div A');return false;"> This is Div A <div style="width:20%;height:100px;background-color:red" onclick="alert('Div B');return false;"> This is Div B </div> </div> 之后,默认情况下不会刷新输出。 相反,它保存在一个缓冲区(几千字节长)。 这是一种常见的技术(不是特定于D),可以大大提高速度,例如,在大量的几字节块中将大文件写入HDD。

要刷新缓冲区,请在每次希望输出立即显示时使用writefln。 在您的子示例代码中的最后一个stdout.flush()之后添加该行可修复示例中的情况。