QThread ans Laufen kriegen

Alles rund um die Programmierung mit Qt
Antworten
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

QThread ans Laufen kriegen

Beitrag 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
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag 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
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag 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
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag 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.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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...
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag 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... :)
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag 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
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag 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
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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....
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag 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
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

okay
Antworten