Die Standardthreads von Qt

Wenn ich eine neue Qt-Anwendung mit einer minimalen Menge Code starte und sie ausführe, sehe ich, dass eine Anzahl von Threads läuft, die mindestens 2 sind und bis zu 5 sein können. Gewöhnlich setzt sie sich auf 2, bis ich Ziehe das Fenster herum, zu diesem Zeitpunkt sehe ich bis zu 4 Threads laufen.

Dies ist der Code, den ich verwende: -

#include 
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget mainWindow;
    mainWindow.show();

    return a.exec();
}

Kann jemand erklären, warum es verschiedene Threads gibt und wofür sie wahrscheinlich sind? Ursprünglich hatte ich nur eine erwartet, wäre aber nicht überrascht, wenn eine Sekunde für den Umgang mit Nachrichten verwendet würde. Was könnte jedoch für die anderen Threads verantwortlich sein?

0
Der gesamte Benutzercode wird standardmäßig im Hauptthread ausgeführt. Es kann andere Threads geben, die jedoch von der internen Implementierung von Qt oder vom Debugger verwendet werden. Wenn Sie normale Anwendungen schreiben, müssen Sie nicht über andere Threads nachdenken. Der gesamte Code zu Ereignissen, Signalen oder Slots wird im Hauptthread ausgeführt, es sei denn, Sie erstellen neue Benutzer-Threads mit der Qt-API.
hinzugefügt der Autor Pavel Strakhov, Quelle
@tebe, wie Sie aus dem Code in der Frage sehen können, sind keine Timer in Verwendung. Der ganze Code, den Sie sehen, ist da.
hinzugefügt der Autor TheDarkKnight, Quelle
@PavelStrakhov, "Wenn Sie normale Anwendungen schreiben" - meine Hauptanwendung ist nicht das, was als "normal" bezeichnet wird, also erstelle ich eine Testanwendung, um zu sehen, was mit Threads passiert, habe aber nicht erwartet, 5 Threads zu sehen solch ein minimaler Code.
hinzugefügt der Autor TheDarkKnight, Quelle
@ Yosim, ich mache mir keine Sorgen; das ist Forschung und interessanterweise konnte noch niemand dies beantworten.
hinzugefügt der Autor TheDarkKnight, Quelle
@tebe: "Wenn du QTimer :: singleShot für einen verzögerten Slot-Aufruf benutzt, glaube ich, dass Qt einen Thread zum Countdown erzeugt." Das ist eine Fantasie. Bitte hör auf, Sachen zu machen.
hinzugefügt der Autor Kuba Ober, Quelle
Wenn Sie sich Sorgen machen, wie viele Threads QT intern verwendet, tun Sie etwas falsch. aus keinem anderen Grund, weil es interne Implementierung ist und jederzeit geändert werden kann. Es sei denn, Sie möchten das aus Neugierde wissen ...
hinzugefügt der Autor yosim, Quelle
Kommentar entfernt, große Verwirrung auf meiner Seite mit einer benutzerdefinierten Implementierung. Sry.
hinzugefügt der Autor tebe, Quelle

1 Antworten

Ich sehe jetzt, dass Sie aus Neugier im Gegensatz zu praktischen Problemen fragen. Lass uns etwas recherchieren.

Ich habe versucht, Ihr Programm auf Qt 5.1 mit MSVC Toolkit unter Windows laufen zu lassen. Ich habe den Debugger so konfiguriert, dass er die Thread-Erstellung unterbricht. Ich habe gesehen, dass 4 zusätzliche Threads erzeugt wurden. 3 von ihnen wurden von Qt verursacht, der RegisterDragDrop native Windows-Funktion aufruft. Wenn ich QWindowsWindow :: registerDropSite Ausführung überspringe, werden diese 3 Threads nicht erstellt. Selbst in der RegisterDragDrop -Dokumentation gibt es keine Erklärung zu den Threads, um nicht zu sagen über Qt-Dokumentation. Offensichtlich kann diese Tatsache variieren, wenn Sie verschiedene Betriebssysteme oder Qt-Versionen verwenden (zum Beispiel können Sie Qt ohne Drag-and-Drop-Unterstützung erstellen). Die einzige Möglichkeit, herauszufinden, warum die Threads für Sie erstellt wurden, ist ein Experiment. Ich denke, OS X hat auch einige Überraschungen für dich.

Der vierte Thread ist für mich ein Rätsel: Der Debugger kann nicht erkennen, wann er gestartet wurde. Vielleicht wird dieser Thread irgendwie vom Debugger verursacht.

Wie ich erwartet hatte, war @tebe falsch und sagte, dass Qt zusätzliche Threads für die QTimer-Verarbeitung erzeugt (ich weiß nicht über alle Fälle, aber in meinem Fall ist das sicherlich falsch). QTimer verwendet die Ereignisschleife des aktuellen Threads.

0
hinzugefügt
Danke, Pavel, dass Sie sich die Zeit genommen haben, sich das genauer anzusehen. Es ist alles interessante Sachen und der Drag-Drop korreliert mit dem, was ich sehe, obwohl es, wie du sagst, immer noch einen Thread gibt, der nicht im Debugger aufhört. Ich würde nicht erwarten, dass die Timer auf verschiedenen Threads ausgeführt werden, sonst würde es bedeuten, dass die GUI durch die Verwendung von Timern blockiert werden könnte, anstatt zusätzliche Threads erstellen zu müssen. Ich werde weiter darüber nachdenken und sehen, wie OSX vergleicht.
hinzugefügt der Autor TheDarkKnight, Quelle