Seite 1 von 1

QFtp in Thread

Verfasst: 22. Februar 2009 14:57
von anno1988
Hallo,

ich habe mal versucht die QFtp Klasse in eine Thread Klasse einzubinden.

Doch das funktioniert irgendwie nicht richtig. Sollte eigentlich ja gehen, das in die QThread Klasse einzubinden.

source datei:

Code: Alles auswählen


#include <QThread>
#include <QtNetwork/QFtp>

#include <string>

using namespace std;

#include "ftpfiletransfer.h"

FTPFileTransfer::FTPFileTransfer() {

	QFtp *ftp = new QFtp(this);

	ftp->connectToHost("ftp.trolltech.com");  // id == 1
	ftp->login();                             // id == 2
	ftp->cd("qt");                            // id == 3
	ftp->get("INSTALL");                      // id == 4
	ftp->close();



}

FTPFileTransfer::~FTPFileTransfer() {


}

void FTPFileTransfer::setLogin(string user_name, string pwd) {



}

void FTPFileTransfer::setRootDir(string dir) {



}

void FTPFileTransfer::setHostName(string host) {


}

header datei:

Code: Alles auswählen


#ifndef FTPFILETRANSFER_H
#define FTPFILETRANSFER_H

class FTPFileTransfer : public QThread {

	protected:

		string muser_name;
		string mpwd;
		string mhost;
		string mroot_dir;


	public:

    FTPFileTransfer();
		~FTPFileTransfer();

		void setLogin(string user_name, string pwd);
		void setRootDir(string dir);
		void setHostName(string host);


};

#endif // FTPFILETRANSFER_H
da bekomme ich dann immer so komische fehler wie:

Code: Alles auswählen

C:/Dokumente und Einstellungen/anno/Desktop/sql/ftpfiletransfer.cpp:20: undefined reference to `_imp___ZN4QFtpC1EP7QObject'
C:/Dokumente und Einstellungen/anno/Desktop/sql/ftpfiletransfer.cpp:22: undefined reference to `_imp___ZN4QFtp13connectToHostERK7QStringt'
C:/Dokumente und Einstellungen/anno/Desktop/sql/ftpfiletransfer.cpp:23: undefined reference to `_imp___ZN4QFtp5loginERK7QStringS2_'
C:/Dokumente und Einstellungen/anno/Desktop/sql/ftpfiletransfer.cpp:24: undefined reference to `_imp___ZN4QFtp2cdERK7QString'
C:/Dokumente und Einstellungen/anno/Desktop/sql/ftpfiletransfer.cpp:25: undefined reference to `_imp___ZN4QFtp3getERK7QStringP9QIODeviceNS_12TransferTypeE'
C:/Dokumente und Einstellungen/anno/Desktop/sql/ftpfiletransfer.cpp:26: undefined reference to `_imp___ZN4QFtp5closeEv'

Verfasst: 22. Februar 2009 15:11
von franzf
Ein paar Sachen:
* verwende doch QString statt std::string
* QThread ist ein QObject, deshalb Q_OBJECT-Macro in den Header
* #include <QThread> gehört in den Header!
* Mach doch das ftp gleich als Member-Variable, wirst ja später drauf zugreifen wollen außerhalb des Konstruktors.

Und jetzt zum Problem:
QT += network im .pro vergessen?

Verfasst: 22. Februar 2009 15:35
von anno1988
ok danke hat alles funktioniert.

Verfasst: 22. Februar 2009 16:17
von anno1988
dann ahbe ich mal noch ausprobiert die ftp klasse in der thread klasse zum laufen zu bekommen, allerdings schmiert mir das programm immer wieder ab.

mein code sieht jetzt so aus:

Code: Alles auswählen



#include "ftpfiletransfer.h"

bool FTPFileTransfer::UploadFiles(QVector<QString> files) {



}


FTPFileTransfer::FTPFileTransfer() {



}

void FTPFileTransfer::run() {



	QFtp *ftp = new QFtp();

	ftp->connectToHost("ftp.trolltech.com");  // id == 1
	ftp->login();                             // id == 2
	ftp->cd("qt");                            // id == 3
	ftp->get("INSTALL");                      // id == 4
	ftp->close();

}

FTPFileTransfer::~FTPFileTransfer() {


}

void FTPFileTransfer::setLogin(QString user_name, QString pwd) {



}

void FTPFileTransfer::setRootDir(QString dir) {



}

void FTPFileTransfer::setHostName(QString host) {


}

Code: Alles auswählen


#ifndef FTPFILETRANSFER_H
#define FTPFILETRANSFER_H

#include <QThread>
#include <QtNetwork/QFtp>
#include <QVector>
#include <QMessageBox>

class FTPFileTransfer : public QThread {

	Q_OBJECT

	protected:

		QString muser_name;
		QString mpwd;
		QString mhost;
		QString mroot_dir;

		bool UploadFiles(QVector<QString> files);

	public:

		FTPFileTransfer();
		~FTPFileTransfer();

		void setLogin(QString user_name, QString pwd);
		void setRootDir(QString dir);
		void setHostName(QString host);
		void run();


};

#endif // FTPFILETRANSFER_H

in meinem mainwindow starte ich dann meine thread klasse so wie es in der hilfe steht, allerdings ohne das wait().

Code: Alles auswählen


FTPFileTransfer ft;

	ft.start();


Verfasst: 22. Februar 2009 16:20
von Christian81
Wie wäre es mal mit debuggen um zu schauen *wo* das Programm abstürzt?
Da ft aber ein Objekt ist vermute ich mal das ft recht schnell wieder gelöscht wird.

Verfasst: 23. Februar 2009 11:58
von anno1988
Noch was anderes dazu.

Geht bei euch das Beispielprogramm für den Download einer Datei über FTP im Qt Framework richtig?

Ich verwendet es in Windows XP, allerdings hängt sich das Programm beim Download einer Datei immer auf.

Ich habe die vorkompilierte Version genommen, die beim Framework bei der Installation schon dabei war.

http://doc.trolltech.com/4.4/network-ftp.html