Seite 1 von 1

[gelöst] sonderbares verhalten meines programmes

Verfasst: 10. Juli 2005 21:40
von slash-ex
also erstmal der code der impl.:

Code: Alles auswählen

//VARIABLEN
QString flist;
char choice;
QString target_path;
QString options;
QString s_filepath;
QString s_file;
QProcess prc;
QStringList strlist;

Code: Alles auswählen

void Form1::extract()
{
    short pos = s_file.find(".tar" , 0);
    s_filepath = s_file.left(pos);
    
    chdir(s_filepath); //cd ..
    system("tar xf " + s_file); //extraction  
    cout<<s_filepath<<endl;
    cout<<"GUT: STAGE 1"<<endl;
    pushButton_conf->setEnabled(1);
}

void Form1::go_conf(QString path, QString  name, QString arg) //
{  
    prc.addArgument(name);

    connect(&prc, SIGNAL(readyReadStdout()), this, SLOT(ready() ) );
    connect(&prc, SIGNAL(processExited()), this, SLOT(finish() ) );   
    choice = 'm';
    
    chdir(path); prc.start();
}

void Form1::conf()
{
    short pos = s_file.find(".tar" , 0);
    s_filepath = s_file.left(pos);
    
    options = lineEdit_parameters->displayText();
    target_path = lineEdit_path->displayText();
   
    go_conf(s_filepath, "./configure", 0);
    cout<<"bearbeite ./configure script"<<endl;
}

void Form1::go_make(QString path, QString  name)
{  
    prc.addArgument(name);
    
    connect(&prc, SIGNAL(readyReadStdout()), this, SLOT(ready() ) );
    connect(&prc, SIGNAL(processExited()), this, SLOT(finish() ) );   
    choice = 'i';
    
    chdir(path); prc.start();
}

void Form1::make()
{
    short pos = s_file.find(".tar" , 0);
    s_filepath = s_file.left(pos);
    
    go_make(s_filepath, "make");
    cout<<"baue Programm"<<endl;
}

void Form1::go_install(QString path, QString  name)
{  
    prc.addArgument(name);
    
    connect(&prc, SIGNAL(readyReadStdout()), this, SLOT(ready() ) );
    connect(&prc, SIGNAL(processExited()), this, SLOT(finish() ) );  
    
    chdir(path); prc.start();
}

void Form1::install()
{
    short pos = s_file.find(".tar" , 0);
    s_filepath = s_file.left(pos);
    
    go_install(s_filepath, "make install");
    cout<<"installiere Programm"<<endl;
    
    //chdir(s_filepath); //cd ..
    //flist_writer("system_before_install.log", filelister() );
}

void Form1::ready() 
{
  while (prc.canReadLineStdout() ) {
     textEdit_log->append(prc.readLineStdout() );
  }  
}

void Form1::finish() 
{
    textEdit_log->append("PROCESS FINISHED");
    
    if(choice == 'm')
	pushButton_make->setEnabled(1);
    if(choice == 'i')
	pushButton_install->setEnabled(1);
}

void Form1::FileDialog()
{
    s_file = QFileDialog::getOpenFileName(
                    "/home",
                    "Archiv (*.tar *.tar.gz *.tar.bz2)");
    
    lineEdit_path_packet->setText(s_file);
}

die funktionen dienen dem entpacken eines tar.bz-archives, dem :/configure des configure scriptes anschließend dem ausführen von "make" und schließlich "make install". das problem ist, dass
a) das archiv (nur wenn es noch nicht entpackt wurde) an eine andere stelle (wo die ausführende datei liegt) entpackt wird, wenn ich das programm mit der konsole öffne.
b) wenn ich normal per mausklick öffne scheint es als ob die bearbeitenden dateien außerhalb des entpackten verzeichnisses kopiert werden und dort bearbeitet werden. allerdings verändern sich auch innerhalb des verzeichnisses dateien.
c) obwohl ich in den oberen funktionen statt ../configure, "make" ausführe steht im log-widget des programmes immer das selbe (nämlich der configure log)

also, der kram macht mich wirklich ratlos.
das prog dient mir zur übung, also entschuldigt die etwas unsaubere form :oops:

ich hoffe man kann mir hier z.T. helfen :o

MFG :!:

Re: sonderbares verhalten meines programmes

Verfasst: 11. Juli 2005 08:54
von macman
Also das Konsolenaufruf und Mausklick vollkommen unterschiedliche Umgebungen sind, wird dir wohl klar sein. Wenn man dann mit relativen Pfaden arbeitet, muß man mit unliebsamen Seiteneffekten rechnen. Dann übergibst Du die Parameter mal mit Slash, mal ohne. ("/configure", "make").
Mal baust Du den Kommandostring aus Pfad und Befehl, mal nur den Befehl.
slash-ex hat geschrieben:das prog dient mir zur übung, also entschuldigt die etwas unsaubere form
Und wir sollen jetzt deinen Fehler finden? Räum da etwas auf, dann wirst Du ihn wahrscheinlich schon von alleine finden.

Nur um mal ein Beispiel zu nennen. Um unter Windows an das Verzeichnis zu kommen, in dem das gestartete Programm liegt, mußt Du den übergebenen Parameter aus main() auswerten. Alle anderen Angaben variieren je nach Aufruf.

Verfasst: 11. Juli 2005 17:54
von slash-ex
Und wir sollen jetzt deinen Fehler finden?
das wäre nett :!:
Nur um mal ein Beispiel zu nennen. Um unter Windows an das Verzeichnis zu kommen, in dem das gestartete Programm liegt, mußt Du den übergebenen Parameter aus main() auswerten. Alle anderen Angaben variieren je nach Aufruf.
das nutze ich, um dem prog bereits zum start ainen pfad zuzuweisen! aber das muss ich nun wirklich nicht posten!
denn eigentlich bastle ich ja eine gui :)

Dann übergibst Du die Parameter mal mit Slash, mal ohne. ("/configure", "make").
aber doch nur weil ich nicht weiß wie :oops: , ich hab doch niemanden der es mir erklären könnte!

ich weise gleich mal darauf hin, dass dies wahrscheinlich der fehlergrund ist. und die hilfe hier anzusetzen dürfte mir am weitesten helfen :!:
ich habe zu keinem zeitpunkt verlangt das man für mich die ******-arbeit macht :idea:

MFG

Verfasst: 11. Juli 2005 21:54
von slash-ex
so ich hab den code oben aktualisiert UND geordnet.
die eigentliche frage:
egal ob ich die conf make oder install fkt ausführe, es wird immer ein configure durchgeführt! jedensfalls ist das aus dem log ersichlich.
ich verstehe nicht warum!!!
soll ich statt prc. system verwenden, ich hoffe nicht!

MFG

Verfasst: 12. Juli 2005 07:34
von macman
slash-ex hat geschrieben:egal ob ich die conf make oder install fkt ausführe, es wird immer ein configure durchgeführt! jedensfalls ist das aus dem log ersichlich.
ich verstehe nicht warum!!!
Ich sehe es jetzt erst :) Du hast den Prozess global angelegt und rufst immer denselben auf. Klingelt's?
Erst übergibst du configure und rufst dann den Prozess ("./configure") auf, soweit noch ok. Dann übergibst du make, was jetzt das 2. Argument für den Prozess ist und deshalb als Parameter für das 1. Argument genutzt wird ("./configure make"). usw. Besser wäre es also in jeder Methode einen eigenen Prozess zu nutzen. Und dann bau noch eine Sicherung ein, nicht das du make aufrufen kannst, während das configure noch läuft.

Verfasst: 12. Juli 2005 11:47
von slash-ex
ohh, das könnts sein.
DANKE :D