Seite 1 von 1

[gelöst] Windows: Qt-Konsolenprogramm soll von Stdin lesen

Verfasst: 11. Dezember 2015 14:26
von Tilman Räger
Hallo,

ich bin gerade dabei, etwas telnet-ähnliches zu schreiben. Das Teil soll als ganz normales Konsolenprogramm von der DOS-Box aus aufgerufen werden und sich mit einem server verbinden. durch eingabe von Befehlen sollen dann verschiedene Dateioperationen auf dem Server ausgeführt werden.

Aktuell verwende ich einen QSocketNotifier, der mit stdin verbunden wird:

Code: Alles auswählen

QSocketNotifier *pNot = new QSocketNotifier(fileno(stdin), QSocketNotifier::Read, this);
connect(pNot, SIGNAL (activated(int)), SLOT(readCommand()));
Dann gehe ich mal davon aus, das ich im Slot readCommand() dann die Eingaben abholen und verarbeiten kann. Funktioniert unter Linux auch problemlos - nur leider nicht unter Windows (Virtualle Maschine unter Win7 (32bit)) - wenn ich hier das Programm von der DOS-Box starte, verbindet es sich brav mit dem Server, gibt den von mir implementierten Prompt aus - und wartet (bis es schwarz wird :-)
Meine Eingaben kommen nicht an - allerdings wenn ich das Programm beende, werden die Kommandos schön der Reihenfolge nach von der DOS-Box abgearbeitet :-(

Hat hier jemand eine Idee, wie ich dem Teil auf die Sprünge helfen kann.

CONFIG += Console
ist im .pro-File enthalten!

Gruss
Tilman (Räger)

Re: Windows: Qt-Konsolenprogramm soll von Stdin lesen

Verfasst: 11. Dezember 2015 16:22
von Christian81
Da stdin/stdout (unter Windows) sich nicht wie ein socket verhält, funktioniert QSocketNotifier unter Windows damit nicht. Siehe z.B. hier: https://bugreports.qt.io/browse/QTBUG-15457
m.E. stand es auch irgendwo in der Doku, finde es aber gerade nicht.

Re: Windows: Qt-Konsolenprogramm soll von Stdin lesen

Verfasst: 11. Dezember 2015 17:26
von Tilman Räger
Daran also liegt es :-)

Ich habe inzwischen das ganze auch mit QFile ausprobiert, stdin geöffnet und den Slot 'readRead' verknüpft - gleiches Ergebnis. Das Ende vom Lied: Ich habe die ganze Signal/Slot geschichte rausgeworfen und eine gute, solide Endlosschleife probiert, in der zu Beginn eine Zeile von stdin gelesen wird - und gut ist.
Damit funktionierts!

Trotzdem Danke an alle, die sich ihr Gehirn zermartert haben ;-)

Gruss
Tilman