Я пытаюсь передать программу Erlang с помощью простого приложения Qt-окна через порт Erlang.Порт Erlang не обрабатывает корректный ответ C++/Qt
Проблема заключается в том, что результат от события окна 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 в порт Эрланга сразу?
UPD. Решение:
Раствор для промывки() буфер в Qt:
вместо fprintf(stdout, "window_input:");
я использовал
cin >> c;
cout << c;
cout.flush();
И это сработало.
P.S. Тем не менее, я не понимаю, почему эта проблема не возникала при тестировании одного и того же приложения Qt на консоли - он возвращал данные, которые я сразу заполнил текстовым полем в окне (т. Е. На событии).
Да, вам нужно явно очистить данные. – rvirding
Спасибо, Hynek и rvirding! Но как я могу это сделать? В своей официальной документации я не нашел ничего, что могло бы явно смыть порт. – skanatek
@MartinLee: Нет, вам не нужно flush _port_, вы должны очистить вывод в своем дескрипторе io stdout i.e. Вызвать 'fflush (stdout)' после вашего сообщения в 'MainWindow :: on_pushButton_clicked' функции. –