Kurzbeschreibung der Umgebung: Ich habe ein Gerät, auf dem eine in qt geschriebene Anwendung ausgeführt wird. Es hat einen Haupt-Thread, der Datenbank-Operationen (SQlite) und einen separaten Thread für Netzwerk-Operationen (via 3G) behandelt. Hauptthread Ereignisschleife wird von QCoreApplication :: exec ausgeführt und der andere Thread, der Netzwerkvorgänge behandelt, wird von QThread :: exec ausgeführt. Btw, Socket-Thread-Affinität wird geändert, nachdem es gestartet wurde (z. B. moveToThread (socketThreadPtr))QTimer feuert spät, weil andere Threads mit großen Schleifen beschäftigt sind
Kurzbeschreibung des Problems: Main Thread ist in einer Schleife beschäftigt, um rund 10k Datensätze aus der Datenbank auswählen und diese Schleife dauert etwa + 30 Sekunden. Im Netzwerk-Thread gibt es einen 15-Sekunden-Timer, der bei jedem Ablauf eine Keep Alive-Nachricht senden muss. Das Problem ist, dass der Slot für das timeout() - Signal erst ausgeführt wird, nachdem die Schleife beendet ist.
Lösung bis jetzt gegründet (aber nicht befriedigend): Wenn ich QCoreApplication :: processEvents in der Schleife aufrufen, die die Datensätze auswählt, ist das Problem gelöst, aber ich frage mich, ob eine Lösung anstelle dieser Problemumgehung vorhanden ist.
Anmerkung: Der Timer, Signal und Slot, der den Befehl zum Senden der Keep Alive-Nachricht gibt, wird derzeit im Haupt-Thread behandelt (aber das Lesen/Schreiben geschieht im Netzwerk-Thread). Außerdem habe ich den Timer im Netzwerk-Thread verschoben, aber ich habe das gleiche Ergebnis wie im Haupt-Thread.
Da der Zeitgeber netzwerkbezogenen es auf dem Netzwerk Gewinde sein soll. Stellen Sie sicher, dass der mit ihm verbundene Steckplatz sich in einem Objekt auch im Netzwerk befindet. –
Der Timer lebt wahrscheinlich noch im Hauptthread. Erstens: Erstellen Sie den Socket direkt im Thread oder setzen Sie den Socketdescriptor und öffnen Sie den Socket mit einer QueuedConnection. Erstellen Sie den Zeitgeber im Konstruktor nicht und rufen Sie movetothread für das Objekt auf. Rufen Sie stattdessen eine Initialisierungsfunktion mit invokeMethod oder einer in einer Warteschlange stehenden Signal/Slot-Verbindung auf. In dieser Funktion erstellen Sie den Timer mit new. Sonst bleibt der Timer eigentlich im Hauptthread –
Hallo Leute! Danke für die schnellen Antworten. Kevin, ich hatte den Timer komplett im Netzwerk-Thread verschoben, mit dem entsprechenden Slot im Netzwerk-Thread. Übrigens wurde der Timer auf dem Heap erstellt. – ionutCb