Seite 1 von 1

QThread ans Laufen kriegen

Verfasst: 25. August 2005 19:02
von kowi1134
Hallo!

In meinem Programm soll ein sehr großes Feld von unterschiedlichen Algorithmen sortiert werden. Damit die GUI aber währendessen nicht "einfriert" möchte ich die Sortieralgorithmen als Threads implementieren.

Dabei gehe ich wie folgt vor:
Ein Klasse namens "AbstractSorting" wird von "QThread" abgeleitet und die Sortieralgorithmen werden von "AbstractSorting" abgeleitet. "AbstractSorting" stellt ein paar Methoden für die Sortieralgorithmen zur Verfügung, sodass diese sich nicht mehr um alles kümmern müssen.

Das ganze ist wie folgt definiert und impelementiert:

AbstractSorting.h

Code: Alles auswählen

class <QThread>;

class AbstractSorting : public QThread 
{ 
Q_OBJECT; 
 
public: 
	AbstractSorting(int *field, int size, QWidget *parent=0);
	virtual bool sort()=0;
protected: 
	void run();

	...
}
AbstractSorting.cpp

Code: Alles auswählen

#include <QThread>

AbstractSorting::AbstractSorting(int *field, int size, QWidget * parent) : QThread(parent) 
{
	...
}
void AbstractSorting::run()
{
    sort();
}
BubbleSort.h

Code: Alles auswählen

#include "AbstractSorting.h"

class BubbleSort : public AbstractSorting 
{ 
public: 
	BubbleSort(int *field, int size, QWidget *parent) : AbstractSorting(field, size, parent) { } 
 
	bool sort(); 
};
BubbleSort.cpp

Code: Alles auswählen

bool BubbleSort::sort() 
{
  ...
}
Wenn ich jetzt mein Programm kompiliere, dann bekomme ich immer die Fehlermeldung:
In file included from src/BubbleSort.h:29,
from src/MainWindow.cpp:32:
src/AbstractSorting.h:38: error: base class `QThread' has incomplete type
Es folgen zwar noch andere, aber ich denke, dass diese erst mal die wichtigste ist, da sie als erste erscheint.

Kann mir jemand helfen?

Ciao

Verfasst: 25. August 2005 19:26
von kowi1134
Ich bin mir nicht ganz sicher, ob es jetzt geht, aber alles was ich verändert habe war:

Code: Alles auswählen

protected:
    void run();
wurde zu:

Code: Alles auswählen

public:
    void run();
und es geht (voraussichtlich).

Ciao

Verfasst: 9. September 2005 16:14
von nando
Hi,
das hat an der Stelle nix public oder protected zu tun...

1.)
Du musst in deinem Header auch den QThread Header inkludieren...
und nicht im cpp. File....

2.) die run methode MUSS virtual sein....

Scheinbar hast du noch C++ Verstaendnisprobleme..
Ich wuerde Dir empfehlen dir mal das ONLINE Buch "Thinking in C++" Vol1 und Vol2" von Bruce Eckel anzusehen...

Viel Erfolg,
Nando

Verfasst: 9. September 2005 17:10
von lepsai
Nun, mein lieber Kollege nando, die Methode run() ist in der Basisklasse, also in QThread, schon als virtuell deklariert. D.h. sie ist in allen abgeleiteten Klassen virtuell. Also statt "Online thinking in C++" lieber mal Straustroup lesen...

Was den Fehler angeht, ist die Konstruktion - class <QThread>; hm, wie soll man sagen, etwas fehlerhaft. Es soll heißen:

#include <qthread.h>

Und nicht vergessen, QT_THREAD_SUPPORT zu setzten.

Verfasst: 9. September 2005 19:57
von Shadow
lepsai hat geschrieben:Nun, mein lieber Kollege nando, die Methode run() ist in der Basisklasse, also in QThread, schon als virtuell deklariert. D.h. sie ist in allen abgeleiteten Klassen virtuell. Also statt "Online thinking in C++" lieber mal Straustroup lesen...
Solange sie nicht in den abgeleiteten Klassen überschrieben wird. In der Basisklasse selbst bleibt sie natürlich virtuell.

Verfasst: 9. September 2005 20:02
von lepsai
Ok, Noch einmal: Ein virtuelle Funktion bleibt in allen abgeleiteten Klassen virtuell. Ein Grund, warum Qt keine virtuelle Destruktoren in den Klassen, die von QObject abgeleitet sind, benutzt...

Verfasst: 10. September 2005 08:04
von Shadow
lepsai hat geschrieben:Ok, Noch einmal: Ein virtuelle Funktion bleibt in allen abgeleiteten Klassen virtuell. Ein Grund, warum Qt keine virtuelle Destruktoren in den Klassen, die von QObject abgeleitet sind, benutzt...
Sag' ich doch... :)

Verfasst: 10. September 2005 10:57
von kowi1134
Ok, ich schalte mich jetzt ein!

Also, ich weiß was virtuelle Methoden sind (virtuell und zwar auf alle Zeit) und wozu man sie braucht (Polymorphismus).

Ich bitte euch, hier nicht weiter zu streiten. Außerdem "nando", Du meinst es wahrscheinlich nicht böse, aber Dein Ton kommt doch schon ziemlich herablassend daher. Ich dachte immer, so reden nur Geeks ;)

Trotzdem vielen Dank an alle.

Ciao

Verfasst: 12. September 2005 15:08
von nando
Halli Hallo,
also wenn das irgendwie "herablassend" oder wie auch immer rueber kam, dann tut's mir leid!!!
So war das nicht gemeint!!!

Und nun noch mal kurz zum Kollegen und C++ GURU "lepsai",
auch wenn eine methode, die einmal als virtual deklariert wurde immer virtual bleibt gehoert es zum guten stil diese auch in den ableitungen als virtuell zu "kennzeichnen", um genau diese Missverstaendnisse zu vermeiden.

Gruss,
Nando

Verfasst: 12. September 2005 15:19
von lepsai
Und nun noch mal kurz zum Kollegen und C++ GURU "lepsai",
auch wenn eine methode, die einmal als virtual deklariert wurde immer virtual bleibt gehoert es zum guten stil diese auch in den ableitungen als virtuell zu "kennzeichnen", um genau diese Missverstaendnisse zu vermeiden.
Lieber Nando, man kann lange darüber streiten, was zum guten Stil gehoert und was nicht, aber Empfehlungen der Art:
2.) die run methode MUSS virtual sein....
Scheinbar hast du noch C++ Verstaendnisprobleme..
gehören sicherlich nicht dazu....

Verfasst: 13. September 2005 20:39
von nando
Da gebe ich dir recht, und dafuer habe ich auch schon sorry gesagt !
also vergessen wir das .... wie es aussieht war es ein missverstaendnis und konzentrieren uns auf unsere arbeit... okay?

gruesse,
Nando

Verfasst: 13. September 2005 21:33
von lepsai
okay