Probleme mit QT-Threads

cesupa

Erfahrenes Mitglied
Hallo,

ich bin schon seit geraumer Zeit am Versuchen, drei ProgressBars gleichzeitig mit Hilfe von QT Threads ablaufen zu lassen, leider klappt das nicht. Jetzt aber erstmal mein Code, ich e übrigens mit Eclipse unter Windows und dem QT-Plugin.

ttest1.h:
Code:
#ifndef TTEST1_H
#define TTEST1_H

#include <QtGui/QWidget>
#include "ui_ttest1.h"
#include "pbthread.h"

class ttest1 : public QWidget
{
    Q_OBJECT

public:
    ttest1(QWidget *parent = 0);
    ~ttest1();

private:
    Ui::ttest1Class ui;
    pbthread *pbt;
    
private slots:
	void on_startButton_clicked();
};

#endif // TTEST1_H

ttest1.cpp:
Code:
#include "ttest1.h"

ttest1::ttest1(QWidget *parent)
    : QWidget(parent)
{
	ui.setupUi(this);
	ui.pbar1->setValue(0);
	ui.pbar2->setValue(0);
	ui.pbar3->setValue(0);
	pbt=new pbthread(&ui);
}

ttest1::~ttest1()
{
delete pbt;
}

void ttest1::on_startButton_clicked()
{
	pbt->start();
}

pbthread.h:
Code:
#ifndef PBTHREAD_H_
#define PBTHREAD_H_

#include <QtGui/QWidget>
#include "ui_ttest1.h"
#include <QThread>
//#undef run

class pbthread : public QThread
{
	Q_OBJECT
	
public:
	pbthread(Ui::ttest1Class* ui2){ui=ui2;}
	~pbthread(){delete ui;}
	void start(){run();}
protected:
	void run();

private:
	Ui::ttest1Class *ui;
};



void pbthread::run()
{
	for(int i=0;i<101;i++)
		{
			ui->pbar1->setValue(i);
			ui->pbar2->setValue(i);
			ui->pbar3->setValue(i);
		}
	exec();
}


#endif /*PBTHREAD_H_*/

Wenn ich das ganze Kompiliere kommt immer folgender Fehler:

release/ttest1.o(.text+0x0):ttest1.cpp: multiple definition of `pbthread::run()'
release/main.o(.text+0x0):main.cpp: first defined here
release/moc_pbthread.o(.text+0x0):moc_pbthread.cpp: multiple definition of `pbthread::run()'
release/main.o(.text+0x0):main.cpp: first defined here
release/moc_ttest1.o(.text+0x0):moc_ttest1.cpp: multiple definition of `pbthread::run()'
release/main.o(.text+0x0):main.cpp: first defined here
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release/ttest1.exe] Error 1
mingw32-make[1]: Leaving directory `F:/eclipse/workspace/thread_test'
mingw32-make: *** [release] Error 2

Ich hab aber leider keine Ahnung warum das so ist, im Prinzip hab ich ja nur das Tutorial von QT dazu abgewandelt verwendet.

Gruß
cesupa
 
Super, jetzt funktionierts. Ich dachte mal so auf die schnelle kann man für den Versuchszweck die run() Funktion im Header definieren, naja, man lernt halt nie aus.
Dankeschön für deine Hilfe.

Gruß
cesupa
 
Hallo nochmal,

ich hab jetzt schon wieder ein Problem mit den Threads, wahrscheinlich ist es mehr ein Verständnisproblem. Also, ich hab vor so eine Art Dateiübertragungsprogramm zu programmieren, mit GUI und allem drum und dran. Dabei wollte ich die eigentliche Verbindung und Übertragung der Datei in einen Thread auslagern, damit meine GUI bei diesem Vorgang nicht "blockiert". Das ganze hab ich so hier probiert:

Code:
void transmission::run()
{
		th->start_server((QString)gh->getPort());

		char* buf=new char[20];
		info* inf2=new info();

		gh->add_event("Empfangsbereit...");
		
		if(!th->recv_info(inf2))
		gh->add_event("Konnte Dateiinformationen nicht empfangen.");
		else
		gh->add_event("Dateiinformationen empfangen. Dateigröße: "+QString(ltoa(inf->get_filesize(),buf,10))+" Byte. Empfange Datei...");
		delete[] buf;
		
		inf->set_filesize(inf2->get_filesize());
		inf->set_hostIP(inf2->get_hostIP());
		delete inf2;
		
		if(!th->recv_file(inf->get_filename(),inf->get_filesize()))
		gh->add_event("Datei konnte nicht empfangen werden.");
		else
		gh->add_event("Datei empfangen.");
		
		th->finish();
		gh->add_event("Verbindung getrennt.");

		exec();
}

Das ist jetzt nurmal der code für den Server. Wenn ich diesen jetzt starte, gibt mir die GUI keine Rückmeldung mehr und der Taskmanager erhöht auch nicht die Anzahl der Threads, was ja eigentlich geschehen müsste. Jetzt frage ich mich, wieso das nicht funktioniert.

Gruß
cesupa
 
Zurück