PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QProcess <incomplete type> ?



central
10-03-2006, 20:40
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,
_

central
10-03-2006, 23:11
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,
_

central
11-03-2006, 19:10
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,
_

central
15-03-2006, 17:02
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