Seite 1 von 1

QFtp sagt mir ich hätte keine Verbindung und ist dann irgend

Verfasst: 27. November 2008 11:57
von Willi2793
Ich habe eine Klasse Ftp abgeleitet von QFtp um mir im Intervall Daten von einem FTP-Sever zu holen. Initialisisert werden die Daten von aussen. Auch der Eventloop ist vorhanden. Die Methode getFiles() wird immer wieder aufgerufen und wenn dann aus dem done-Slot das Signal gesendet wird, wird eine biosschen gewartet und dann die Methode getFiles() erneut aufgerufen. Das funktioniert auch soweit. Mein Problem ist, das ich in der listEntry-Methode get() und remove() aufrufe und der get() dann einen Error 4 (nicht connected) bekommt. nach ein paar Durchläufen wird dann noch nicht mal mehr das done()-Signal emittiert.

Ich hänge hier mal den Ftp-Code an und auch die Ausgaben des qDebug() bis es nicht mehr weiter geht. Hat jemand eine Idee?

Grüße,
Willi


ftp.h

Code: Alles auswählen

#ifndef FTP_H_
#define FTP_H_

#include <QFile>
#include <QFtp>
#include <QMutex>
#include <QStringList>
#include <QThread>
#include <QUrlInfo>

class Ftp : public QFtp {

	Q_OBJECT

public:
	Ftp();
	virtual ~Ftp();
    void setUser(const QString& user) { this->user = user; }
    void setPassword(const QString& password) { this->password = password; }
    void setHost(const QString& host) { this->host = host; }
    void setLocDir(const QString& locDir) { this->locDir = locDir; }
    void setRemDir(const QString& remDir) { this->remDir = remDir; }
    const QString& getUser() const { return this->user; }
    const QString& getPassword() const { return this->password; }
    const QString& getHost() const { return this->host; }
    const QString& getLocDir() const { return this->locDir; }
    const QString& getRemDir() const { return this->remDir; }
    const QStringList& getErrMsg() const { return this->errmsg; }
    void delErrMsg();

    void getFiles();

signals:
   	void end();

private slots:
	void listEntry(const QUrlInfo&);
	void endProc(bool);
	void cmdFinished(int, bool);

private:
	QString user;
	QString password;
	QString host;
	QString locDir;
	QString remDir;
    QStringList errmsg;
    QStringList dirlist;
    QString dir;
    QList<QFile*> files;
    QMutex sperre;

    int idConnect;
    int idLogin;
    int idCd;
    int idList;
    int idGet;
    int idRemove;
    int idClose;

	QString getStr(const int);
};

#endif /* FTP_H_ */

ftp.cpp

Code: Alles auswählen

#include <QDebug>
#include <QDir>
#include "ftp.h"

Ftp::Ftp() : QFtp() {
    connect(this, SIGNAL(listInfo(const QUrlInfo&)), this, SLOT(listEntry(const QUrlInfo&)));
    connect(this, SIGNAL(commandFinished (int, bool)), this, SLOT(cmdFinished(int, bool)));
    connect(this, SIGNAL(done(bool)), this, SLOT(endProc(bool)));
    idConnect = -1;
    idLogin = -1;
    idCd = -1;
    idList = -1;
    idClose = -1;
    idGet = -1;
    idRemove = -1;
}

Ftp::~Ftp() {
}

void Ftp::getFiles() {
	qDebug() << "getFiles() Start";
	idConnect = connectToHost(getHost());
	idLogin = login(getUser(),getPassword());
	idCd = cd(getRemDir());
	idList = list();
	idClose = close();
	qDebug() << "getFiles() Stop " << getStr(idConnect) << getStr(idLogin)<< getStr(idCd)<< getStr(idList)<< getStr(idClose);
}

void Ftp::delErrMsg() {
	while (!errmsg.isEmpty()) {
	    errmsg.takeFirst();
	}
}

void Ftp::listEntry(const QUrlInfo& entry) {
	qDebug() << "listEntry() Start";
	if (entry.isFile()) {
		QDir d(getLocDir());
		QString file(d.absolutePath());
	    QFile* f = new QFile(d.absolutePath() + QDir::separator() + entry.name());
	    files.append(f);
	    if (f->open(QFile::WriteOnly)) {
	    	qDebug() << "listEntry() State " << getStr(state());
	    	idGet = get(entry.name(),f);
	    	errmsg.append(getRemDir() + ": get " + entry.name());
	    	idRemove = remove(entry.name());
	    } else {
	    	QString xx(d.absolutePath() + QDir::separator() + entry.name());
	    	qDebug() << "Fehler beim öffnen der lokalen Datei: " << xx;
	    }
	} else {
	}
	qDebug() << "listEntry() Stop " << getStr(idGet) << getStr(idRemove);
}

void Ftp::endProc(bool err) {
	if (err) {
		qDebug() << "endProc() Start  ERROR: " << getStr(error());
	} else {
		qDebug() << "endProc() Start";
	}
	if (hasPendingCommands()) {
		qDebug() << "Es sind noch Commands da";
		clearPendingCommands();
	} else {
		qDebug() << "Es sind KEINE Commands da";
	}
	QString num;
	num.setNum(files.size());
	errmsg.append(getRemDir() + ": " + num + " Dateien geholt");
	while (!files.isEmpty()) {
	    QFile* f = files.takeFirst();
	    f->close();
	    delete f;
	}
	qDebug() << "endProc() Stop";
	emit end();
}

QString Ftp::getStr(const int num) {
	QString rc;
	rc.setNum(num);
	return rc;
}

void Ftp::cmdFinished(int id, bool err) {
	if (err) {
		qDebug() << "cmdFinished() Start id: " << getStr(id) << "   Error: " << getStr(error());
	} else {
		qDebug() << "cmdFinished() Start id: " << getStr(id);
	}
}

Ausgabe: (Die "Anfang run"s sind aus der aufrufenden Methode)
Anfang run!
getFiles() Start
getFiles() Stop "1" "2" "3" "4" "5"
cmdFinished() Start id: "1"
cmdFinished() Start id: "2"
cmdFinished() Start id: "3"
listEntry() Start
listEntry() Stop "-1" "-1"
listEntry() Start
listEntry() State "4"
listEntry() Stop "6" "7"
cmdFinished() Start id: "4"
cmdFinished() Start id: "5"
cmdFinished() Start id: "6" Error: "4"
endProc() Start ERROR: "4"
Es sind KEINE Commands da
endProc() Stop
Anfang run!
getFiles() Start
getFiles() Stop "8" "9" "10" "11" "12"
cmdFinished() Start id: "8"
cmdFinished() Start id: "9"
cmdFinished() Start id: "10"
listEntry() Start
listEntry() Stop "6" "7"
listEntry() Start
listEntry() State "4"
listEntry() Stop "13" "14"
cmdFinished() Start id: "11"
cmdFinished() Start id: "12"
cmdFinished() Start id: "13" Error: "4"
endProc() Start ERROR: "4"
Es sind KEINE Commands da
endProc() Stop
Anfang run!
getFiles() Start
getFiles() Stop "15" "16" "17" "18" "19"
cmdFinished() Start id: "15"
cmdFinished() Start id: "16"
cmdFinished() Start id: "17"
listEntry() Start
listEntry() Stop "13" "14"
listEntry() Start
listEntry() State "4"
listEntry() Stop "20" "21"
cmdFinished() Start id: "18"
cmdFinished() Start id: "19"
cmdFinished() Start id: "20" Error: "4"
endProc() Start ERROR: "4"
Es sind KEINE Commands da
endProc() Stop
Anfang run!
getFiles() Start
getFiles() Stop "22" "23" "24" "25" "26"
cmdFinished() Start id: "22"
cmdFinished() Start id: "23"
cmdFinished() Start id: "24"
listEntry() Start
listEntry() Stop "20" "21"
listEntry() Start
listEntry() State "4"
listEntry() Stop "27" "28"
cmdFinished() Start id: "25"
cmdFinished() Start id: "26"
cmdFinished() Start id: "27" Error: "4"
endProc() Start ERROR: "4"
Es sind KEINE Commands da
endProc() Stop
Anfang run!
getFiles() Start
getFiles() Stop "29" "30" "31" "32" "33"
cmdFinished() Start id: "29"
cmdFinished() Start id: "30"
cmdFinished() Start id: "31"
listEntry() Start
listEntry() Stop "27" "28"
listEntry() Start
listEntry() State "4"
listEntry() Stop "34" "35"
cmdFinished() Start id: "32"
cmdFinished() Start id: "33"
cmdFinished() Start id: "34" Error: "4"
endProc() Start ERROR: "4"
Es sind KEINE Commands da
endProc() Stop
Anfang run!
getFiles() Start
getFiles() Stop "36" "37" "38" "39" "40"
cmdFinished() Start id: "36"
cmdFinished() Start id: "37"
cmdFinished() Start id: "38"
listEntry() Start
listEntry() Stop "34" "35"
listEntry() Start
listEntry() State "4"
listEntry() Stop "41" "42"
cmdFinished() Start id: "39"

Verfasst: 28. November 2008 16:02
von Willi2793
So, ich habe nun nochmal einen knappen Tag dran gehängt und meine folgendes herausgefunden zu haben:

Wenn dieselbe Instanz einer QFtp-Klasse mehrfach benutzt wird kommt es zu Problemen und sie reagiert dann irgendwann nicht mehr korrekt.

Der close()-Befehl wirft nicht immer das commandFinished() und done()-Signal.

Diese 2 Sachen führten dann bei mir zu größeren Problemen.

Verfasst: 28. November 2008 16:30
von pfid
Arbeitest du mit Threads?

Verfasst: 28. November 2008 18:10
von Willi2793
Ohne Threads. Also eine Event-Queue ist da. Die anderen Signale werden ja auch geworfen. Und das close()-Signal auch oft, aber halt nicht immer.