我正在尝试通过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应用程序时没有发生这个问题 - 它立即返回数据我填写了窗口中的文本字段(即事件)。
答案 0 :(得分:3)
我对C ++没有那么多经验,但似乎你没有从你的端口刷新数据。 (并且"~n"
也不是C ++中的新行,因为您使用stream
模式而不是line
,因此不是新的。)