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アプリをテストしても、この問題が発生しなかった理由がわかりません。ウィンドウのテキストフィールドに入力した直後に(つまり、イベント時に)データが返されました。