PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QT/KDE(3) Ausführen von ext. Programmen



TheDodger
23-04-2002, 05:20
So, ich bin ziemlich weit gekommen in den letzten Tagen ... ;)

Das ausführen von ext. Programmen unter QT/KDE(3) gestalltete sich reichlich einfach nach anda_skoa's Tipp zu KProcess etc.
Da gab es zwar noch ein paar Hürden, aber die konnte man lösen

Allerdings möchte ich die Übergebenen Argumente als Debug-Ausgabe zum Schluß noch mal sehen ... Ansonsten tappt man doch manchmal reichlich im Nebel herum.
Bei KPrecess hat man die Möglichkeit, die Argumentenliste via args() auszulesen.
Blöderweise liefert args() allerdings kein QStringList, sonder ein QStrList zurück.
( Wieso, keine Ahnung ... hab nicht mal feststellen können, was für große Unterschiede zwischen beiden bestehen )

Jedenfalls muß ich QStrList nach QStringList ... ach, schaut selber:



KProcess _proc;

_proc.setExecutable( execFile );

_proc << _argument1;

[...]

QStrList _strList( &_proc.args() );
QStringList _stringList;
_stringList.fromStrList( _strList );

QString t;

for ( QStringList::Iterator it = _stringList.begin(); it != _stringList.end(); ++it )
{
t.append( *it );
}
qDebug( "'"+ t + "'" );


Kurioserweise steht in t nüx drin, obwohl ich gut ein dutzent Argumente hinzugefügt habe!
Naja, ich mache bestimmt (mal wieder) einen Denkfehler ...

Sieht den vielleicht jemand von euch?

anda_skoa
23-04-2002, 12:26
Original geschrieben von TheDodger
So, ich bin ziemlich weit gekommen in den letzten Tagen ... ;)



Darf man fragen, an was da gerade du arbeitest?



( Wieso, keine Ahnung ... hab nicht mal feststellen können, was für große Unterschiede zwischen beiden bestehen )


QStrList ist eine Liste von char*, StringList eine Liste von QString.
Außerdem ist QStringList eine QValueList, also keine Pointer.



QStrList _strList( &_proc.args() );
QStringList _stringList;
_stringList.fromStrList( _strList );



;)
Was sagt uns folgendes:
QStringList::fromStrList ( const QStrList & ascii ) [static]
Hmm, static.

Dein Aufruf solte vielleicht so aussehen:


QStringList _stringList = QStringList::fromStrList(_strList);




Sieht den vielleicht jemand von euch?

:cool:
Hab ihn!
:D

Ciao,
_

TheDodger
23-04-2002, 20:00
Original geschrieben von anda_skoa


Darf man fragen, an was da gerade du arbeitest?

darf man, darf man :))

Ein UI für AntiVir im Moment und danach für das AV-Mailgate.
Und danach ... mal schauen. Irgendeine Konfigdatei gibt es bestimmt noch ... :D
[quote][b]
Dein Aufruf solte vielleicht so aussehen:


QStringList _stringList = QStringList::fromStrList(_strList);


gleich testen ... ;)

TheDodger
25-04-2002, 17:30
Original geschrieben von TheDodger

Dein Aufruf solte vielleicht so aussehen:


QStringList _stringList = QStringList::fromStrList(_strList);

gleich testen ... ;)

Das Ergebniss war ein leerer String.
Macht nix, denn die Parameterübergabe funktioniert ja wunderbar.
Sinnigerweise muß man das ganze etwas umständlich erledigen und jeden Parameter mittels 'proc << "param"' KProcess übergeben. Eine zusammengestellte Parameterliste als QString war leider nicht möglich.

But anyway ...

Ich starte KProcess mit 'proc.start( KProcess::Block, KProcess::AllOutput );'
Logischweise blockiert jetzt das KProcess das aufrufende Programm und somit auch ein refresh des UI's. Schlechter Stil IMHO ...

Hat jemand eine andere Idee?
Sollte man das nicht über KProcess erledigen, sondern über einen eigenen Thread?
Idealerweise sollte der gestartete Prozess auch über ein Signal abbrechbar sein ... :)

anda_skoa
25-04-2002, 18:20
Original geschrieben von TheDodger


Ich starte KProcess mit 'proc.start( KProcess::Block, KProcess::AllOutput );'
Logischweise blockiert jetzt das KProcess das aufrufende Programm und somit auch ein refresh des UI's. Schlechter Stil IMHO ...


IMHO auch :)



Hat jemand eine andere Idee?
Sollte man das nicht über KProcess erledigen, sondern über einen eigenen Thread?


Ich kann dir folgende Lektüre wärmstens empfehlen:
http://developer.kde.org/documentation/library/cvs-api/classref/kdecore/KProcess.html
Nennst sich API Dokumentation der Klasse KProcess ;)

Aber ich will mal nicht so sein :cool:
Das executable wird ohnehin in einem eigenen Process gestartet.
Wenn du statt KProcess::Block eine der beiden anderen Modi benutzt (DontCare, oder NotifyOnExit wenn du wissen willst, wann das executable aufhört)

Dann blockier auch deine GUI nicht!
Edit: da hätte ich doch fast vergessen, darauf hinzuweisen, dass in diesem Fall vom Anlegen der KProcess Instanz auf dem stack abegraten wird und statt dessen eine solche am Heap vorzuziehen ist.



Idealerweise sollte der gestartete Prozess auch über ein Signal abbrechbar sein ... :)


Dis wird dem geneigten Leser von
http://developer.kde.org/documentation/library/cvs-api/classref/kdecore/KProcess.html#ref12
als Übung überlassen :D

Ciao,
_

TheDodger
26-04-2002, 04:17
Original geschrieben von anda_skoa

Ich kann dir folgende Lektüre wärmstens empfehlen:
http://developer.kde.org/documentation/library/cvs-api/classref/kdecore/KProcess.html
Nennst sich API Dokumentation der Klasse KProcess ;)

Aber ich will mal nicht so sein :cool:
Das executable wird ohnehin in einem eigenen Process gestartet.
Wenn du statt KProcess::Block eine der beiden anderen Modi benutzt (DontCare, oder NotifyOnExit wenn du wissen willst, wann das executable aufhört)

Dann blockier auch deine GUI nicht!
Edit: da hätte ich doch fast vergessen, darauf hinzuweisen, dass in diesem Fall vom Anlegen der KProcess Instanz auf dem stack abegraten wird und statt dessen eine solche am Heap vorzuziehen ist.

Ja, hatte ich auch schon probiert.
Das Problem an der Sache ist, das dann AntiVir nicht korrekt ausgeführt wird (?) ...
Ich wollte das UI jedenfalls während des scannens mittels eines BusyPointers blockieren um zu zeigen, das was passiert. Wenn ich NotifyOnExit oder DontCare nutze, wird das UI den bruchteil einer Sekunde blockiert und fertig ... Im evtl. angelgtem Logfile wird auch nicht vermerkt . :(




Dis wird dem geneigten Leser von
http://developer.kde.org/documentation/library/cvs-api/classref/kdecore/KProcess.html#ref12
als Übung überlassen :D


:)
Was denkst du, steht in meinem original Source schon drin? ;)

anda_skoa
26-04-2002, 09:08
Original geschrieben von TheDodger

Ja, hatte ich auch schon probiert.
Das Problem an der Sache ist, das dann AntiVir nicht korrekt ausgeführt wird (?) ...
Ich wollte das UI jedenfalls während des scannens mittels eines BusyPointers blockieren um zu zeigen, das was passiert. Wenn ich NotifyOnExit oder DontCare nutze, wird das UI den bruchteil einer Sekunde blockiert und fertig ... Im evtl. angelgtem Logfile wird auch nicht vermerkt . :(


Hmm. :confused:

Wie sieht dein aktueller Code in der Klasse aus, die KProcess benutzt?
Vielleicht benutzt du keine mit new erzeugten KProcess und er wird wieder gelöscht, sobald die aktuelle Methode aus ist.

Wenn du NotifyOnExit machst und in einem Slot, der auf processExited connected ist, am übergebenen KProcess normalExit() aufrufst, ist das dann true oder false?

Ciao,
_

TheDodger
26-04-2002, 13:22
Original geschrieben von anda_skoa

Vielleicht benutzt du keine mit new erzeugten KProcess und er wird wieder gelöscht, sobald die aktuelle Methode aus ist.

wahrscheinlich lag es wohl daran ... und daran, daß das Logfile aus meine App nicht korrekt geladen wurde.
Ich erzeuge jetzt mein proc mit new und frage auch normalExit() ab, um den BusyCorsor wieder zu löschen ...

In diesem Falle war ich wohl ein wenig blauäugig ...

danke dir!