ich verzweifle bei der Thread-Programmierung. VIelleicht wißt ihr ja Hilfe. Ich habe ein sehr großes Projekt, aber ich versuche mal die Klassen die Probleme bereite zu skizzieren. Sämtliche Thread-spezifischen Funktionen sind enthalten, alles andere wurde der Übersicht halber weggelassen. Ich hoffe es ist verständlich.
Das Problem ist: Ich erstelle QThreads innerhalb eines QThread. Das finished()-Signal der im QThread erzeugte Qhreads kommt nicht.
Ich habe eine Basisklasse für Threads, davon sind dann die eigentlichen Thread-Klassen abgeleitet.
Hier die Klassen:
Die Basisklasse für Threads:
Code: Alles auswählen
class WorkThread : public QThread
{
Q_OBJECT
protected:
WorkThread()
{
connect(this, SIGNAL(finished()), this, SLOT(OnFinished()));
}
public:
virtual void StartThread()
{
start();
}
private:
virtual void run()
{
m_bRunSuccess = OnRun();
}
private slots:
void OnFinished()
{
OnThreadFinished();
}
protected:
virtual bool OnRun() = 0; //< true if successfully run
virtual bool OnThreadFinished() = 0;
}; // class WorkThread
Folgende Implementirung funktioniert einwandfrei. Nach Beendigung der OnRun() Methode wird OnThreadFinished() aufgerufen.
Code: Alles auswählen
main()
{
Geht *pGeht = new Geht();
pGeht->StartThread();
}
class Geht : public WorkThread
{
public:
Geht : WorkThread()
{
}
protected:
virtual bool OnRun()
{
....
mach was;
...
return true;
}
virtual bool OnThreadFinished()
{
...kommt hier an !!!!
return true;
}
};
Jetzt wirds komplizierter. Es gibt zwei Threadklassen, MainThread und SubThread. MainThread erzeugt die SubThreads und wartet darauf, das die sich beenden. Die OnFinished()-Methode der SubThreads wird allerdings nicht aufgerufen, obwohl die OnRun()-Methode definitiv beendet wird:
Code: Alles auswählen
class MainThread : public WorkThread
{
public:
MainThread : WorkThread()
{
}
protected:
virtual bool OnRun()
{
SubThread *pSubThread = new SubThread()
pSubThread->StartThread();
// warte auf SubThread...
while (pSubThread not finished)
{
SchlafeEinWenig...
}
return true;
}
virtual bool OnThreadFinished()
{
return true;
}
};
Code: Alles auswählen
class SubThread : public WorkThread
{
public:
SubThread : WorkThread()
{
}
protected:
virtual bool OnRun()
{
tu was........
return true;
}
virtual bool OnThreadFinished()
{
!!! kommt hier nie an, also wird
!!! offensichtlich das finished-signal der von der
!!! Basisklasse nicht emittiert
return true;
}
};
Vielen Dank für eure Mühe und hoffentlich baldige Hilfe