Kommunikation mit JLine
Kommunikation mit JLine
Hallo,
ich stehe mal wieder vor einem Problem.
In meinem Programm muss ich mit einem Java-Programm kommunizieren, dass
JLine verwendet. Den Output kann ich Problemlos mit QProcess::readAll() auslesen.
Nur wenn ich dem Programm ein Bytearray sende mit QProcess::write(QByteArray)
schein dies nicht an zu kommen, da im Terminal immer ein Echo kommt
(Befehl ausgeführt/Befehl existiert nicht).
Ich persönlich denke ich versuche in den falschen Inputstream zu schreiben, aber
gefunden hab ich darüber noch nichts.
Gruß Ü-Ei
ich stehe mal wieder vor einem Problem.
In meinem Programm muss ich mit einem Java-Programm kommunizieren, dass
JLine verwendet. Den Output kann ich Problemlos mit QProcess::readAll() auslesen.
Nur wenn ich dem Programm ein Bytearray sende mit QProcess::write(QByteArray)
schein dies nicht an zu kommen, da im Terminal immer ein Echo kommt
(Befehl ausgeführt/Befehl existiert nicht).
Ich persönlich denke ich versuche in den falschen Inputstream zu schreiben, aber
gefunden hab ich darüber noch nichts.
Gruß Ü-Ei
Re: Kommunikation mit JLine
Demo-Code?
Bzw. siehe: http://www.proggen.org/forum/viewtopic. ... 591#p13194
Bzw. siehe: http://www.proggen.org/forum/viewtopic. ... 591#p13194
Re: Kommunikation mit JLine
Mit dem Abfangen des Outputs habe ich keine Probleme, denn ich sehe
den Standartoutput des Programmes, was auch im Terminal zu sehen ist.
Hier der Beispielcode:
MainWindow.h
MainWindow.cpp
die main.cpp ist autogeneriert.
Ist das mit dem Prog->write(QByteArray) richtig?
Das wäre hier an dieser Stelle meine einzige Frage.
Wenn das stimmt muss ich mich an ein Java-Forum
weden und die mal Fragen wie das mit JLine geht
den Standartoutput des Programmes, was auch im Terminal zu sehen ist.
Hier der Beispielcode:
MainWindow.h
Code: Alles auswählen
#include <QMainWindow>
#include <QString>
#include <QTreeWidgetItem>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
void Laden(QTreeWidgetItem *parent, QString Name, int High);
~MainWindow();
private slots:
void on_treeView_itemClicked(QTreeWidgetItem *item, int column);
private:
Ui::MainWindow *ui;
};
Code: Alles auswählen
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSettings>
#include <QStringList>
#include <QTreeWidgetItem>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTreeWidgetItem *neu = new QTreeWidgetItem(ui->treeView, QTreeWidgetItem::Type);
neu->setText(0, "HKEY_LOCAL_MACHINE");
this->Laden(neu, "HKEY_LOCAL_MACHINE", 0);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::Laden(QTreeWidgetItem *parent, QString Name, int High)
{
if(High > 4){
return;
}
QSettings Momentan(Name, QSettings::NativeFormat);
QStringList Sammeln = Momentan.childGroups();
for(int i = 0; i<Sammeln.count(); i++){
QTreeWidgetItem *neu = new QTreeWidgetItem(parent);
neu->setText(0, Sammeln.at(i));
neu->setText(1,Name + "\\" + Sammeln.at(i));
this->Laden(neu, Name + "\\" + Sammeln.at(i), High + 1);
}
QStringList Sammelntwo = Momentan.childKeys();
for(int i = 0; i<Sammelntwo.count(); i++){
QTreeWidgetItem *neu = new QTreeWidgetItem();
neu->setText(0, Sammelntwo.at(i));
neu->setText(1,Name + "\\" + Sammelntwo.at(i));
neu->setText(2, Momentan.value(Sammelntwo.at(i)).toString());
parent->addChild(neu);
}
}
void MainWindow::on_treeView_itemClicked(QTreeWidgetItem *item, int column)
{
ui->lineEdit->setText(item->text(1));
}
Ist das mit dem Prog->write(QByteArray) richtig?
Das wäre hier an dieser Stelle meine einzige Frage.
Wenn das stimmt muss ich mich an ein Java-Forum
weden und die mal Fragen wie das mit JLine geht
Re: Kommunikation mit JLine
Wenn du dir den verlinkten Beitrag genau anschaust, wirst du sehen, dass ich Kommandos an meinen Prozess schicke.Ü-Ei hat geschrieben:Mit dem Abfangen des Outputs habe ich keine Probleme, denn ich sehe
den Standartoutput des Programmes, was auch im Terminal zu sehen ist.
Ich sehe diese Zeile im Code nicht. Prinzipiell ist es die richtige Methode, aber ich weiß nicht unter welchen Umständen du sie aufrufst.Ü-Ei hat geschrieben:Ist das mit dem Prog->write(QByteArray) richtig?
Mit "Demo-Code" meinte ich etwas Kurzes, Kompilierbares, das aber trotzdem genau das macht was du willst. Und das sowohl für Qt als auch die Java-Seite.
Re: Kommunikation mit JLine
Ach Himmel noch mal! Da hatte ich in der Eile den falschen Code gepackt!
Hier der richtige:
Mainwindow.h
Mainwindoe.cpp
Mit der letzten Funktion MainWindow::SendCommand() will ich einen Befehl an Java geben.
Auf der Java-Seite wird es problematisch, da ich da nur ein gekauftes Programm habe und ich sonst überhaupt nicht mit Java kann. Ich habe nur nach langem recherieren herausgefunden, dass JLine da heufige Probleme machen sollte aber noch keine Lösung gefunden.
Hier der richtige:
Mainwindow.h
Code: Alles auswählen
#include <QMainWindow>
#include <QProcess>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_InputText_LineEdit_returnPressed();
void on_SendButton_clicked();
void SendCommand();
void ReadAll();
private:
Ui::MainWindow *ui;
QProcess *Prog;
};
Code: Alles auswählen
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QSettings>
#include <QFile>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
bool error = false;
//Prüfen der auszuführenden Datei
QFile Infor(QDir::currentPath()+"/Infor.jar");
if(!Infor.exists()){
ui->Output_TextEdit->append("Infor ist nich im Hauptverzeichniss");
error = true;
}
//Finden von Java
QSettings Java("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment",QSettings::NativeFormat);
QString Javaversion = Java.value("CurrentVersion").toString();
QString Javalocation;
ui->Output_TextEdit->append(Javaversion);
if(Javaversion.isEmpty()){
ui->Output_TextEdit->append("Java is not installed");
error = true;
} else {
QSettings Jpath("HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\"+Javaversion,QSettings::NativeFormat);
Javalocation = Jpath.value("JavaHome").toString();
}
//Nicht starten wenn Fehler erkannt wurde
if(error){
return;
}
//Starten von Infor-Javaapllication
Prog = new QProcess(this);
Prog->setProcessChannelMode(QProcess::MergedChannels);
connect(Prog, SIGNAL(readyRead()), this, SLOT(ReadAll()));
QString JarFilePath = QDir::currentPath()+"/Infor.jar";
QStringList args;
args<<"-jar"<<JarFilePath.replace("/","\\");
Prog->start(Javalocation + "\\bin\\javaw.exe", args, QProcess::ReadWrite);
ui->Output_TextEdit->append("Started Java with Infor.jar");
}
MainWindow::~MainWindow()
{
delete ui;
Prog->close();
Prog->waitForFinished();
delete Prog;
}
void MainWindow::on_InputText_LineEdit_returnPressed()
{
this->SendCommand();
}
void MainWindow::on_SendButton_clicked()
{
this->SendCommand();
}
void MainWindow::ReadAll()
{
QByteArray Output = Prog->readAll();
QString convert(Output);
ui->Output_TextEdit->append(convert);
}
void MainWindow::SendCommand()
{
Prog->write(ui->InputText_LineEdit->text().toUtf8());
ui->InputText_LineEdit->setText("");
}
Auf der Java-Seite wird es problematisch, da ich da nur ein gekauftes Programm habe und ich sonst überhaupt nicht mit Java kann. Ich habe nur nach langem recherieren herausgefunden, dass JLine da heufige Probleme machen sollte aber noch keine Lösung gefunden.
Re: Kommunikation mit JLine
Dein Code ist so noch immer nicht kompilierbar. Das UI und die Projektkonfiguration fehlen. Außerdem hast du noch nicht beschrieben was das Java-Programm mit der Eingabe machen soll bzw. was deine Eingabe überhaupt ist.
Blöd drauf los geraten würde ich sagen häng im Qt-Programm ein Newline an den Text dran, den du Java schickst.
Blöd drauf los geraten würde ich sagen häng im Qt-Programm ein Newline an den Text dran, den du Java schickst.
Re: Kommunikation mit JLine
Hier ist eine zip: https://www.dropbox.com/s/exqlmlubkluaunn/Example.zip
Re: Kommunikation mit JLine
Und was macht das Java-Programm mit der Eingabe? Kann man davon eine Dummy-Version nachbauen?
Re: Kommunikation mit JLine
Ich überhaupt keinen Schimmer von Java, aber ich denke das dieser Code hier funktionieren sollte.
http://jeszysblog.wordpress.com/2012/04 ... ith-jline/
Konnte es aber nicht ausführen, da ich keinen Java-Compiler habe.
http://jeszysblog.wordpress.com/2012/04 ... ith-jline/
Konnte es aber nicht ausführen, da ich keinen Java-Compiler habe.
Re: Kommunikation mit JLine
Das ist leider nicht wirklich eine Antwort auf meine Frage, so kann ich dir leider nicht weiterhelfen :/
Ich habs geschafft Kommandos an eine Demo-Anwendung von der Homepage zu schicken und die Antwort auszulesen. Wirklich gut scheint das unter Linux nicht zu funktionieren, auch wenn ich das Programm direkt auf der Konsole starte.
Ich habs geschafft Kommandos an eine Demo-Anwendung von der Homepage zu schicken und die Antwort auszulesen. Wirklich gut scheint das unter Linux nicht zu funktionieren, auch wenn ich das Programm direkt auf der Konsole starte.