Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  QThread: Destroyed while still running     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
N00by123
Unregistrierter




Beitrag N00by123 Unregistrierter 17:00:06 18.01.2012   Titel:   QThread: Destroyed while still running            Zitieren

hi,



ich erstelle einen thread:


C/C++ Code:
 sort s;
    s.setName(filename);
    s.start();
C/C++ Code:
sort s;
s.setName(filename);
s.start();
C/C++ Code:
 sort s;
    s.setName(filename);
    s.start();


C/C++ Code:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
class sort : public QThread
{

private:


public:
    sort();
    void run();
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
class sort : public QThread
{

private:


public:
sort();
void run();
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
class sort : public QThread
{

private:


public:
    sort();
    void run();
};



C/C++ Code:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
void sort::run()
{

    exec();

//meine funktionen...  
    exit();
}
C/C++ Code:
1
2
3
4
5
6
7
8
void sort::run()
{

exec();

//meine funktionen...
exit();
}
C/C++ Code:
1
2
3
4
5
6
7
8
void sort::run()
{

    exec();

//meine funktionen...  
    exit();
}



Wieso stürzt mein Programm immer ab ?


Zitat:
QThread: Destroyed while still running



Danke...
arghonaut
Unregistrierter




Beitrag arghonaut Unregistrierter 17:27:56 18.01.2012   Titel:              Zitieren

QThread::start() startet deine run() in einem neuen Thread und kehrt dann sofort wieder zurück, während der neue Ausführungsstrang munter vor sich hinwerkelt.
Und jetzt überleg dir, wie lange dein "sort s" lebt, wann genau es zerstört wird.
N00by123
Unregistrierter




Beitrag N00by123 Unregistrierter 09:14:51 19.01.2012   Titel:              Zitieren

s wird wohl nach s.start() wieder freigegeben.

C/C++ Code:
class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    sort s;
C/C++ Code:
class MainWindow : public QMainWindow
{
Q_OBJECT

private:
sort s;
C/C++ Code:
class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    sort s;


Das habe ich als lösung versucht. s sollte ja dann lange genug leben. Das Problem ist nur, dass mir garnicht mein Fenster angezeigt wird. Das Programm läuft einfach nur im Hintergrund und ich muss es mit dem Taskmanager beenden....

C/C++ Code:
class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    sort *s;
C/C++ Code:
class MainWindow : public QMainWindow
{
Q_OBJECT

private:
sort *s;
C/C++ Code:
class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    sort *s;

C/C++ Code:
 s = new sort;
    s->setName(filename);
    s->start();
C/C++ Code:
s = new sort;
s->setName(filename);
s->start();
C/C++ Code:
 s = new sort;
    s->setName(filename);
    s->start();

C/C++ Code:
MainWindow::~MainWindow()
{
    s->terminate();
    delete s;
    delete ui;
}
C/C++ Code:
MainWindow::~MainWindow()
{
s->terminate();
delete s;
delete ui;
}
C/C++ Code:
MainWindow::~MainWindow()
{
    s->terminate();
    delete s;
    delete ui;
}



Damit stürzt das Programm immer ab, nachdem ich es beende. Anscheinend läuft der thread noch weiter...
arghonaut
Unregistrierter




Beitrag arghonaut Unregistrierter 11:59:20 19.01.2012   Titel:              Zitieren

Ah, jetzt seh ich noch was andere:
Du hast in deiner run() als erstes das exec(). exec startet die Eventloop im Thread, und diese läuft halt ewig weiter. Das heiß, die Methoden NACH exec() werden nie aufgerufen! (Naja, schon, aber erst wenn exec() terminiert)
Das kann natürlich den SegFault verursachen.

Bei "sort s" als Member sagst du, das Fenster wird nicht angezeigt. Meinst du das MainWindow?
Kannst du mal bitte ein komplettes, kompilierbares Beispielprogramm hier reinstellen, das dein Problem verdeutlicht?
Q
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.07.2011
Beiträge: 318
Beitrag Q Mitglied 20:20:41 23.01.2012   Titel:              Zitieren

Erstmal musst du das Threadobjekt in den zugehörigen thread verschieben (klingt komisch, ist aber wichtig.
Und im Destruktor musst du dem Thread dann sagen, dass er die eventloop verlassen soll und solange warten, bis die eventloop zuende ist.

Sieht dann ungefähr so aus (Methodennamen etc. ausm kopf):
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
sort::sort()
{
   moveToThread(this);
}

sort::~sort()
{
  QMetaObject::invokeMethod(this, "quit");
  wait();
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
sort::sort()
{
moveToThread(this);
}

sort::~sort()
{
QMetaObject::invokeMethod(this, "quit");
wait();
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
sort::sort()
{
   moveToThread(this);
}

sort::~sort()
{
  QMetaObject::invokeMethod(this, "quit");
  wait();
}


Zuletzt bearbeitet von Q am 19:09:30 24.01.2012, insgesamt 1-mal bearbeitet
C/C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  QThread: Destroyed while still running   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.