Archiv verlassen und diese Seite im Standarddesign anzeigen : QProcess <incomplete type> ?
Hallo ,
habe einen kleines Problem und würde mich über Hilfe freuen,
es geht um folgendes .
Ich habe ein commandline tool (obexftp) für das ich gerade eine Oberfläche schreibe.
Die Befehle setzte ich über QProcess ab .
verbinde mit dem Signal processExited um das Ende des processes mitzubekommen.
wenn ich nun in einer konsole
obexftp -b 00:00:01:AD:FE -B 10 -l
eingebe dauert es bis zur Abarbeitung ca 2 Sek.
wenn ich nun das im meine Programm über
proc=new QProcess(this);
proc->addArgument( "obexftp" );
proc-> addArgument( "-b" );
proc-> addArgument( " 00:00:01:AD:FE" );
proc-> addArgument( "-B" );
proc-> addArgument( "-l" );
connect( proc, SIGNAL(readyReadStdout()),
this, SLOT(readFromStdout()) );
connect( proc, SIGNAL(processExited()),
this, SLOT(processEnde()) );
dauert das etwa 12 Sek.
nachdem ich debugt habe , habe ich erfahren
{ "proc", "struct QProcess *", "<incomplete type>" }
warum woran liegt das ? was mache verkehrt ?
gruß
central
anda_skoa
10-03-2006, 22:08
Ohne mehr Code kann man nicht viel sagen.
Übrigens gibt es glaub ich eine liboebx, also die Möglichkeit direkt selber ein Programm zu schreiben
Ciao,
_
OK kein Problem,
das ist der Button zum starten
void corepushWDG::useDevice_Slot()
{
progressBar1->setProgress(0);
QTextStream btst(&btdevice);
if( !btdevice.open( IO_WriteOnly ) )
{
QMessageBox::critical( 0,
tr("Fatal error"),
tr("Could not open file."),
tr("Quit") );
exit( -1 );
}
//cout << endl;
btst << comboBox1->currentText() << endl; // die ID from phone
btdevice.close();
//sleep(1);
useDeviceB->setFlat(true);
acces();
proc-> addArgument( "-l" );
connect( proc, SIGNAL(readyReadStdout()),
this, SLOT(readFromStdout()) );
//connect( proc, SIGNAL(readyReadStderr()),
// this, SLOT(readFromStderr()) );
connect( proc, SIGNAL(processExited()),
this, SLOT(processEnde()) );
if ( !proc->start() ) {
// error handling
QMessageBox::critical( 0,
tr("Fatal error"),
tr("could not start obexftp"),
tr("Quit") );
exit( -1 );
}
}
und hier access
void corepushWDG::acces()
{
proc=new QProcess(this);
//proc->clearArguments ();
proc->addArgument( "obexftp" );
proc-> addArgument( "-b" );
proc-> addArgument(comboBox1->currentText());
proc-> addArgument( "-B" );
switch (int i = comboBox2->currentItem())
{
case 0: proc-> addArgument( "12" );
textLabel1->setText("nokia selectet channel 12");
break;
case 1: proc-> addArgument( "10" );
textLabel1->setText("siemens selectet channel 9");
break;
case 2: proc-> addArgument( "7" );
textLabel1->setText("ericcson selectet channel 10");
break;
case 3:proc-> addArgument("5");
textLabel1->setText("siemens selectet channel 9");
break;
}
}
im header
nur mal das relevante
public slots:
virtual void readFromStdout();
virtual void processEnde();
virtual void useDevice_Slot();
virtual void acces();
protected:
/*$PROTECTED_FUNCTIONS$*/
QProcess *proc;
das dürfte eigentlich alles relevant sein wenn du noch was brauchst keine Problem
bin ja schon mal froh das jemand überhaupt schaut :)
Übrigens gibt es glaub ich eine liboebx, also die Möglichkeit direkt selber ein Programm zu schreiben
Ja, ist richtig heißt libopenobex.
Ist aber wohl um einiges schwerer und aufwendiger als ein frontend zu schreiben.
gruß
central
anda_skoa
11-03-2006, 17:50
connect( proc, SIGNAL(readyReadStdout()),
this, SLOT(readFromStdout()) );
//connect( proc, SIGNAL(readyReadStderr()),
// this, SLOT(readFromStderr()) );
connect( proc, SIGNAL(processExited()),
this, SLOT(processEnde()) );
Wie sehen denn die beiden Slots aus?
Ja, ist richtig heißt libopenobex.
Ist aber wohl um einiges schwerer und aufwendiger als ein frontend zu schreiben.
Nicht unbedingt. Ich glaub irgendwo im KDE SVN (vielleicht playground oder kdenonbeta) mal Qt Code dafür gesehen zu haben, vermutlich eben auch für ein Obex Frontend.
Ciao,
_
Hm,
also der Slot readFromStdout()
{
}
ist leer
und der Slot processEnde()
ist momentan ziemlich unerheblich da das Problem ja vorher schon liegt.
Also es dauert ca 12 sek bis das Signal ProcessExited kommt und erst dann
bearbeite ich die Daten was innerhalb einer Sek. abgearbeitet ist .
wenn Du eine Idee hast warum der Process solange braucht bis er ein ProcessExited sendet oder eine Idee wie ich das abkürzen könnte wäre ich dir echt dankbar.
gruß
central
anda_skoa
12-03-2006, 15:29
Hmm, leider keine echte Idee woran das liegen könnte.
Vielleicht ist das nicht Lesen der Ausgabe ein Verzögerungsgrund.
Allerdings wäre mir ein solches Verhalten bisher unbekannt.
Ciao,
_
Gefahr erkannt Gefahr gebannt :)
Das Problem war das in der Zeile
proc -> addArgument (combox1->currentText());
wohl am ende noch Leerzeilen enthalten waren :confused:
wieso, weshalb, warum weiß keiner so genau :)
Die Lösung
proc -> addArgument (combox1->currentText().simplifyWhiteSpace());
gruß
central
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.