gpt4 book ai didi

d - 使用 D 控制交互过程

转载 作者:行者123 更新时间:2023-12-04 11:54:49 24 4
gpt4 key购买 nike

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

我怎么能从 D 控制那个程序?换句话说,我怎么能

  • 给子进程一行标准输入。
  • 等待子进程应答。
  • 重复,直到我用尽我想给它的输入。

  • 我尝试了以下代码,但毫不奇怪,它等待子进程完全完成,然后一次打印输出:
    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);
    }
    }

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

    The following was input 500 ms ago: test string 1
    The following was input 500 ms ago: test string 2



    所需的行为是它打印

    The following was input 500 ms ago: test string 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);
    }
    }

    最佳答案

    罪魁祸首是子进程。
    writefln ,默认情况下不刷新输出。
    相反,它被保存在一个缓冲区中(几千字节长)。
    这是一种常见的技术(并非特定于 D),它可以大大提高速度,例如,将大文件以大量的几字节块写入 HDD。

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

    关于d - 使用 D 控制交互过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34692565/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com