Seite 1 von 1

Shell Command ausführung erkennen in Qt

Verfasst: 10. Juni 2006 11:24
von andiK
Hallo zusammen,

ich habe folgendes Problemchen, dass ich gerne eleganter lösen würde:

Eine Server Applikation empfängt ein Signal von einem Sensor . Ausgelöst durch den Empfang dieses Sensorsignal führt die Applikation ein vorher konfiguriertes Shell command aus, in dem der Sensorwert irgendiwe ausgegeben werden kann.

Ich möchte nun in meinem QtProgramm mitbekommen, wenn ein solches Sensorsignal empfangen wird und natürlich auch den Messwert erhalten. Was für ein Shellkommando sollte ich denn einstellen und wie bekomme ich die Info im Qt Programm dann mit?

Meine jetzige Lösung ist, dass ich den Sensorwert mit "echo messwert > /tmp/datei" in einer Datei ablege, aber dann muss ich ja ständig das Datum der Datei pollen um einen neuen Wert erkennen zu können und dann den Messwert aus der Datei laden.

Hat jemand eine Idee, wie's besser geht?!?

Grüsse,

Andi

Verfasst: 10. Juni 2006 13:57
von upsala
Wenn du unter KDE programmierst könntest du DCOP verwenden.

Ansonsten könntest du noch einen TCP-Socket öffnen und die Daten mit netcat hineinbefördern.

Re: Shell Command ausführung erkennen in Qt

Verfasst: 12. Juni 2006 07:25
von macman
andiK hat geschrieben:Hat jemand eine Idee, wie's besser geht?!?
Du rufst dein Programm auf und übergibst den Messwert als Parameter, mit QtSingleApplication geht das auch bei einem laufenden Programm. Etwas genauer, ich starte mein Programm, eventuell mit Parametern. Diese Parameter werden ausgeführt, das Programm läuft danach weiter. Starte ich das Programm jetzt noch mal, stellt QtSingleApplication sicher das nur eine Instanz des Programms läuft, andererseits kann ich per Signal die Parameter an einen Slot meines laufenden Programms schicken.

Du rufst also immer wieder dein Programm mit dem Sensorwert auf, den Rest erledigt das Programm. QtSingleApplication ist jedoch Teil von QtSolutions und nur für die Kommerzversion verfügbar.

Verfasst: 12. Juni 2006 07:52
von andiK
Hallo upsala und Macman,

danke für die Tipps, die Ansätze klingen ja wirklich gut.

Allerdings habe ich DCOP nicht implementiert und ich hab' auch nur die Open Source Version von Qt.

@upsala: Könntest Du mir noch etwas detailierter die Idee mit dem TCPSocket und netcat beschreiben?

Die Idee über IP zu gehen hatte ich auch schon, allerdings noch keinen Plan, wie ich auf command line ebene diese Daten über IP abschicken kann.

Viele Grüsse,

Andi

Verfasst: 12. Juni 2006 15:39
von upsala

Code: Alles auswählen

echo messwert | netcat localhost 9876

Code: Alles auswählen

class Test : public QTextEdit
{
Q_OBJECT
public:
	Test(QWidget *parent=0);

protected slots:	
	void newConnection();
	void readData();

private:
	QTcpServer *m_server;	
};

Code: Alles auswählen

Test::Test(QWidget *parent)
	: QTextEdit(parent)
{
	m_server=new QTcpServer(this);
	if (!m_server->listen(QHostAddress::Any, 9876)) {
		append(m_server->errorString());
	}
	connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
}

void Test::newConnection()
{
	QTcpSocket *socket=m_server->nextPendingConnection();
	if (socket) {
		connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
		connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
	}
}

void Test::readData()
{
	QTcpSocket *socket=qobject_cast<QTcpSocket*>(sender());
	if (socket) {
		QByteArray data=socket->readAll();
		append(data);
		socket->disconnectFromHost();
	}
}


Verfasst: 13. Juni 2006 06:58
von andiK
Hallo upsala,

super, danke für Deine Hilfe!

Gruesse,

Andi