Erlang端口不能正确处理C ++ / Qt回复

时间:2011-12-13 22:21:34

标签: c++ qt erlang stdin erlang-ports

我正在尝试通过Erlang端口与简单的Qt窗口应用程序通信Erlang程序。

问题是Qt窗口事件(on_pushButton_clicked())的结果仅在窗口关闭后显示在Erlang端口中,而不是在按下按钮时显示:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "stdio.h"
#include "choosefileform.h"

#include <iostream>
using namespace std;


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{

    fprintf(stdout, "window_input:");
    printf(ui->lineEdit->text().toAscii());
printf("~n");


    ChooseFileForm* fn  = new ChooseFileForm();

    this->close();
    fn->show();
}

Erlang(发送消息在这里什么都不做,我们有兴趣从Qt获取数据):

connect(Message) ->
    Cmd = "./myqtwindowapp \n",
    Port = open_port({spawn,Cmd}, [stream,use_stdio,exit_status]),
    Payload = string:concat(Message, "\n"),
    erlang:port_command(Port, Payload),
    receive
        {Port, {data, Data}} ->
            ?DBG("Received data: ~p~n", [Data]),
        Other ->
            io:format("Unexpected data: ~p~n", [Other])
    after 15000 ->
            ?DBG("Received nothing~n", [])
    end.

运行它并在窗口中填充文本字段的结果是什么(Erlang什么都没有,只是在receive子句中等待):

只有当我手动关闭窗口时,Erlang才说:

Received data: "window_input:hello"

那么,为什么我不能立即从Qt获取数据到Erlang端口?

UPD。溶液

解决方案是刷新()Qt的缓冲区:

而不是fprintf(stdout, "window_input:");我用过

cin >> c;
cout << c;
cout.flush();

它有效。

P.S。但是,我不明白为什么在控制台中测试相同的Qt应用程序时没有发生这个问题 - 它立即返回数据我填写了窗口中的文本字段(即事件)。

1 个答案:

答案 0 :(得分:3)

我对C ++没有那么多经验,但似乎你没有从你的端口刷新数据。 (并且"~n"也不是C ++中的新行,因为您使用stream模式而不是line,因此不是新的。)