2011-12-13 2 views
1

Я пытаюсь передать программу 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 на консоли - он возвращал данные, которые я сразу заполнил текстовым полем в окне (т. Е. На событии).

ответ

3

Я не так много опытен с C++, но, похоже, вы не очищаете данные от своего порта. (А также "~n" не является новой строкой на C++, которая не является причиной, потому что вы используете stream вместо line.)

+1

Да, вам нужно явно очистить данные. – rvirding

+0

Спасибо, Hynek и rvirding! Но как я могу это сделать? В своей официальной документации я не нашел ничего, что могло бы явно смыть порт. – skanatek

+0

@MartinLee: Нет, вам не нужно flush _port_, вы должны очистить вывод в своем дескрипторе io stdout i.e. Вызвать 'fflush (stdout)' после вашего сообщения в 'MainWindow :: on_pushButton_clicked' функции. –

 Смежные вопросы

  • Нет связанных вопросов^_^