QFtp in Thread

Alles rund um die Programmierung mit Qt
Antworten
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

QFtp in Thread

Beitrag 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'
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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?
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

ok danke hat alles funktioniert.
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag 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();

Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag 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
Antworten