Witam,
Napisałem prostą (tak myślę) aplikację konsolowąw C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace AppConsoleSharp
{
class Program
{
static int WorkerInstance = 0, InsideWorkers = 0;
static void Main(string[] args)
{
WorkerInstance++;
Worker worker = new Worker(); // class Worker w konsolowej aplikacji
Menu:
string cmd = Console.In.ReadLine();
if (!string.IsNullOrEmpty(cmd))
{
InsideWorkers++;
Console.Out.WriteLine("Command: " + cmd);
Console.Out.WriteLine("Workers: " + WorkerInstance.ToString());
Console.Out.WriteLine("WorkersInside: " + InsideWorkers.ToString());
worker.ExecuteCommand(cmd);
Thread.Yield();
}
if (cmd != "exit")
{
goto Menu;
} else
{
worker.Close();
}
Console.Out.WriteLine("Behinde Menu");
}
}
}
Następnie próbuję uruchomić to z aplikacji GUI Qt:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include "qdebug.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow), dvb(nullptr)
{
ui->setupUi(this);
connect(ui->pbSend, &QPushButton::clicked, this, &MainWindow::sendCommand);
connect(ui->pbStart, &QPushButton::clicked, this, &MainWindow::startProcess);
dvb = new QProcess(this);
dvb->setWorkingDirectory(QApplication::applicationDirPath());
dvb->setProcessChannelMode(QProcess::SeparateChannels);
dvb->setProgram("AppConsoleSharp.exe");
connect(dvb, &QProcess::started, [&]() {
qDebug() << "Process started: ID =" << dvb->processId();
});
connect(dvb, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[=](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug() << "Process finished: " << exitStatus;
});
connect(dvb, &QProcess::readyReadStandardOutput, [=]() {
qDebug() << "Process readyReadStandardOutput: ";
});
connect(dvb, &QProcess::readyRead, [=]() {
qDebug() << "Process readyread: ";
qDebug() << dvb->readAll();
});
connect(dvb, &QProcess::stateChanged, [=](QProcess::ProcessState state) {
qDebug() << "Process stateChanged: " << state;
});
}
MainWindow::~MainWindow()
{
if (dvb) {
dvb->terminate();
dvb->close();
}
delete ui;
}
void MainWindow::sendCommand(bool ok)
{
dvb->write(ui->lnCmd->text().toLatin1());
dvb->closeWriteChannel();
}
void MainWindow::startProcess(bool ok)
{
dvb->start();
dvb->waitForStarted();
// dvb->write("exit");
// dvb->waitForBytesWritten();
}
Po uruchomieniu aplikacji Qt, po wykonaniu konstruktora MainWindow otrzymuję komunikaty:
Process stateChanged: QProcess::Starting
Process stateChanged: QProcess::Running
Process started: ID = 5164
Po naciśnięciu buttona pbSend - nic się nie dzieje.
Przy zamknięciu okna aplikacji Qt:
Process stateChanged: QProcess::NotRunning
Process finished: QProcess::CrashExit
Docelowo: chcę uzyskać możliwość komunikacji w obie strony (coś jak przez QLocalServer, albo QTcp)
Bardzo proszę o naprowadzenie na właściwy tor. Bardzo mi zależy aby to zrobić przez QProcess.
Proszę o pomoc,
Pozdrawiam.
.