Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  QThread richtig einsetzen  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Saheb
Mitglied

Benutzerprofil
Anmeldungsdatum: 10.11.2016
Beiträge: 116
Beitrag Saheb Mitglied 10:42:56 11.07.2017   Titel:   QThread richtig einsetzen            Zitieren

Hallo zusammen,

@Schlangenmensch

Problem habe ich mittlerweile gelöst.
Es reicht eigentlich vollkommen, wenn ich Signal/Slot verwende.
Danke noch mal.
It0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.07.2004
Beiträge: 2063
Beitrag It0101 Mitglied 13:07:01 14.07.2017   Titel:              Zitieren

Ich nutze einfach mal den Thread hier weil ich ebenfalls ein Problem mit QThread habe.

Ich nutze QThread folgendermaßen, um aufwändige Arbeit zu erledigen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TimeSeriesManager::TimeSeriesManager( QObject *parent ) :
    QObject( parent )
{
    auto worker = new TimeSeriesLoader();
    worker->moveToThread( &thread );
 
    assert( QObject::connect( this, SIGNAL( sigLoadTimeSeries(std::shared_ptr<TimeSeries>)), worker, SLOT(onLoadTimeSeries(std::shared_ptr<TimeSeries>)) ) );
    assert( QObject::connect( worker, SIGNAL(sigTimeSeriesLoaded(std::shared_ptr<TimeSeries>)), this, SLOT(onTimeSeriesLoaded(std::shared_ptr<TimeSeries>)) ) );
    assert( QObject::connect( &thread, SIGNAL(finished()), worker, SLOT(deleteLater())));
    thread.start();
}
 
 
TimeSeriesManager::~TimeSeriesManager()
{
    thread.quit();
    thread.wait();
}



D.h. der Thread läuft dauernd und bekommt über SIGNAL/SLOT seine Arbeit zugewiesen. Beim Start der Applikation bekommt der Thread so an die 2000 Jobs übertragen.

Nun will ich die Anwendung beenden. Das Problem ist, dass der Thread trotz Aufruf von "quit()" erst noch seine Eventloop abarbeitet, d.h. die Anwendung endet erst, wenn der Thread alle seine Jobs abgearbeitet hat, was reichlich bescheuert ist.

Gibt es eine Möglichkeit den Thread zu überzeugen, die Eventloop zu leeren?
Cardiac
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.04.2017
Beiträge: 114
Beitrag Cardiac Mitglied 13:19:36 14.07.2017   Titel:              Zitieren

Laut source nicht.

Das ist recht spannend...der eventDispatcher scheint selbst einen QAbstractEventDispatcher::interrupt() zu "ignorieren"...

Dir wird wohl nichts anderes uebrig bleiben als deinen eigenen QAbstractEventDispatcher zu schreiben.

Edit: Hast du es bereits mit QThread::setTerminationEnabled und QThread::terminate probiert?


Zuletzt bearbeitet von Cardiac am 14:02:25 14.07.2017, insgesamt 4-mal bearbeitet
Schlangenmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.11.2008
Beiträge: 395
Beitrag Schlangenmensch Mitglied 14:15:33 14.07.2017   Titel:              Zitieren

QThread::terminate gibt aber keine Garantie, wann und wo der Thread beendet wird. Könnte also mitten in einer Schreiboperation passieren, was zu einem inkonsistenten Zustand führen könnte.

Wenn ich It0101 richtig verstehe, soll der Thread auch ruhig seinen aktuellen Job noch abarbeiten, nur die anderen 99, die noch in der Queue sind, nicht mehr, oder?
It0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.07.2004
Beiträge: 2063
Beitrag It0101 Mitglied 14:25:43 14.07.2017   Titel:              Zitieren

Schlangenmensch schrieb:

Wenn ich It0101 richtig verstehe, soll der Thread auch ruhig seinen aktuellen Job noch abarbeiten, nur die anderen 99, die noch in der Queue sind, nicht mehr, oder?


Genau das.
Ich könnte auch das "wait" einfach weglassen und den Thread dann sterben lassen, während er noch läuft. Beim ShutDown der Applikation wäre das ja halb so schlimm.

Aber ich will es halt möglichst ordentlich beenden. Daher das wait(). Leider wartet er mir etwas zu lange ;-)
Cardiac
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.04.2017
Beiträge: 114
Beitrag Cardiac Mitglied 14:28:02 14.07.2017   Titel:              Zitieren

Ich finde es auch extrem befremdlich, dass QEventLoop keinerlei interrupt oder aehnliches zur verfuegung stellt...Ich meine, das wird doch vermutlich oefter benoetigt, wenn man unendliche queues laufen hat.
It0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.07.2004
Beiträge: 2063
Beitrag It0101 Mitglied 14:46:03 14.07.2017   Titel:              Zitieren

Dachte ich eigentlich auch...
C++ Forum :: Andere GUIs - Qt, GTK+, wxWidgets ::  QThread richtig einsetzen  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6
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++.net 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 und www.c-plusplus.net 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.