1

Erlangポートを介してErlangプログラムをシンプルな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からErlangポートにすぐにデータを取得しないのはなぜですか?

UPD。解決:

解決策は、Qtのバッファをflush()することでした。

fprintf(stdout, "window_input:");私が使用する代わりに

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

そしてそれはうまくいった。

PSただし、コンソールで同じQtアプリをテストしても、この問題が発生しなかった理由がわかりません。ウィンドウのテキストフィールドに入力した直後に(つまり、イベント時に)データが返されました。

4

1 に答える 1

3

私はC++の経験はあまりありませんが、ポートからデータをフラッシュしないようです。(また、代わりにモード"~n"を使用するため、C ++の改行ではありません。)streamline

于 2011-12-13T22:48:49.913 に答える