Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确使用QProcess write?_C++_Qt_Scanf_Qprocess - Fatal编程技术网

C++ 如何正确使用QProcess write?

C++ 如何正确使用QProcess write?,c++,qt,scanf,qprocess,C++,Qt,Scanf,Qprocess,我需要一个程序来与依赖于in-and的子进程通信 输出。问题是我显然无法正确使用QProcess 下面的代码应该创建一个QProcess,启动它并进入主while循环。在那里,它将子流程创建的所有输出打印到控制台,然后请求用户输入,然后通过write(…)将输入传递到子流程 最初,我在这个场景中遇到了两个问题: 父进程无法读取子进程的printf 子流程中的scanf未接收通过write发送的字符串 至于(1),我逐渐意识到这是由子进程的stdout缓冲引起的问题。通过fflush(stdout

我需要一个程序来与依赖于in-and的子进程通信 输出。问题是我显然无法正确使用
QProcess

下面的代码应该创建一个QProcess,启动它并进入主while循环。在那里,它将子流程创建的所有输出打印到控制台,然后请求用户输入,然后通过
write(…)
将输入传递到子流程

最初,我在这个场景中遇到了两个问题:

  • 父进程无法读取子进程的
    printf
  • 子流程中的
    scanf
    未接收通过
    write
    发送的字符串
  • 至于(1),我逐渐意识到这是由子进程的stdout缓冲引起的问题。通过
    fflush(stdout)
    调用或操作其刷新行为,可以轻松解决此问题

    第二个问题是我无法解决的问题
    write
    被调用,甚至返回正确的发送字节数。但是,子流程没有继续执行,因为没有新数据写入其输出。
    scanf
    似乎没有收到发送的数据。程序给出的输出为:

    子流程应该已经启动。
    124字节可用!
    正在尝试读取:
    阅读:这是一个简单的演示应用程序。
    阅读:它只阅读标准文本,并重复其内容。
    读取:输入退出以终止。
    阅读:---------
    等待用户输入:测试
    写入5字节
    没有要读的行。。。
    等待用户输入:
    
    我真的被困在这里了。谷歌+沉重的思想已经在我身上失败了,我想把它传递给你,作为我最后的希望灯塔。如果我只是看不到森林里所有的树,我道歉

    如果需要这些信息:我正在使用Qt5和clang编译器处理64位MacOS X。子流程代码是在同一台机器上用gcc编译的

    事先非常感谢

    天然橡胶

    主代码:

    intmain(){
    //用于执行子流程的命令
    QString程序=“./demo”;
    qprocesssub;
    sub.start(程序,QProcess::Unbuffered | QProcess::ReadWrite);
    //检查子流程是否正确启动。
    如果(!sub.waitForStarted()){
    
    std::cout这将不起作用。您正在等待写入发送的字节,但没有等待回显。相反,您正在输入getline()函数,等待新的用户输入。请记住,这里涉及两个进程,每个进程都可能延迟到任何程度


    除了此之外,您应该考虑异步构建QT应用程序(具有事件循环)而不是尝试同步方法。通过这种方式,您的Qt应用程序可以并行执行操作…例如,读取输入或等待远程进程的输入,同时仍然无法阻止并能够接受用户输入。

    您是否尝试过
    sub.waitforbytesWrite()
    sub.write(“\n”)之后
    ?编辑:我刚刚尝试过,但没有改变结果。子流程仍然拒绝生成新的输出。仔细想想,这不是到目前为止的预期结果吗?您写出了数据,并将其发送到了子流程,子流程甚至可能已经收到并处理了它,但我希望父流程是正确的检查
    if(!sub.canReadLine()){
    要快得多。如果是这样,那么在您的子流程有时间做出反应之前,您的父流程再次等待您的输入,而不是子流程。您可以编写更多的输入并查看子流程到那时是否有输出吗?
    sub.canReadLine()
    始终为false,无论写入了多少输入。调用
    sub.bytesavable()
    也始终返回相同的数字。
    bool QIODevice::canReadLine()const[virtual]
    如果可以从设备读取完整的数据行,则返回true;否则返回false。请注意,无法确定可以读取的内容的未缓冲设备总是返回false。因此,您将
    QProcess
    声明为
    QProcess::unbuffered
    …我想您比我在中解释得更好我的评论。可能是关于竞争条件的模糊。因此QProcess与主进程同步运行,这意味着getline()有效地阻止了子进程?不。在其他进程发送回显之前,您正在输入getline()。在等待getline()时(这是一个阻止函数调用!)您无法从另一个进程读取任何延迟的回显。好的。因此,当子进程打印最后一次写入的回显时,主程序卡在getline。因此,主进程不会立即显示回显。现在我提供了更多输入,导致循环重新启动。子进程的最后一次打印现在不可用吗?因为这没有发生。无论我提供了多少次输入或等待了多长时间,都没有发生任何事情。用答案编辑了问题。似乎种族条件真的是罪魁祸首。尽管我不知道为什么,但它现在起作用了。非常感谢大家:)