2011-01-15 3 views
0

Ich versuche, eine Echtzeit-Datenerfassungsanwendung, die Task hat Zeit zu machen. Jede Aufgabe kann einen anderen oder den gleichen Aktualisierungszeitraum haben. Ich möchte die Aufgabe mit dem gemeinsamen Aktualisierungszeitraum in einer Liste speichern, in der ich sie durchlaufen und die Funktion aufrufen kann, die ich in der Liste registriert habe. Wie würde ich Callbacks zu einer Datenstruktur wie einer Liste oder einem Vektor hinzufügen? Kann ich Slots darin speichern?Qt Liste der Rückrufe

Antwort

2

Sie können Callback-Funktionen in Form von boost :: function in eine Datenstruktur wie Liste oder Vektor einfügen.

Wenn Sie jedoch zeitlich abgestimmten Aufgaben haben und diese Aufgaben möchte in bestimmten Abständen wiederholen, können Sie einfach eine Liste von QTimer speichern kann

QList<QTimer> timed_tasks; 

In Ihrem Setup finden Sie den richtigen Timer auf die Verbindung korrekte Steckplatzfunktionen. Dann starte deine Qt-Ereignisschleife.

Wenn Sie ein sehr dichtes Sammlungsprogramm ausführen (d. H. Viele lange Aufgaben, die jedoch in Echtzeit ausgeführt werden müssen), sollten Sie Ihre Steckplatzfunktionen in separaten Threads verwenden. Auf diese Weise kann Ihre Hauptereignisschleife immer noch ausgeführt werden (und Tasks abfeuern). Andernfalls werden Aufgaben, die zu lange dauern, andere Aufgaben nicht ausführen, da die Ereignisschleife nicht rechtzeitig zurückkehrt, um die anderen fälligen Aufgaben auszulösen.

Sie können diese Aufgaben auch in Bezug auf QRunnable implementieren und einen QThreadPool bereitstellen, der sie ausführt. Ich schlage vor, Sie überprüfen http://doc.qt.io/archives/4.6/threads.html, wenn Sie diese Straße hinunter gehen.

UPDATE: Die oben vorgeschlagene Lösung behandelt mehrere Timer, die gleichzeitig zünden. Um dem Benutzer die Kontrolle darüber zu geben, welcher Timer ausgelöst werden soll (d. H. Welcher Wert zu sammeln ist), können Sie QObject :: killTimer und QObject :: startTimer verwenden. Dies erfordert keinen zusätzlichen Speicherplatz für Bittabellen oder andere Mechanismen zum Speichern, welcher Timer gerade aktiv ist.

+0

das ist fast, was ich will, aber es wird mehrere Aufgabe, die die gleiche Aktualisierungsrate haben kann. Ich entwerfe es so, dass ich in der GUI auswählen kann, welche Werte ich überwachen möchte. Vielleicht kann ich eine Liste von Enums erstellen, die einen realen Wert darstellen, der gesammelt werden muss. Wenn der Timer das Zeitlimit überschreitet, wird das Element aus der Liste abgerufen und anschließend an eine Statusmaschine weitergeleitet, die die richtige Funktion aufruft. – Talguy

+0

Bitte beachten Sie mein Update bezüglich einer vielleicht besseren Lösung für das, was Sie versuchen zu tun. –

+0

ok also jedes Mal, wenn einer der Timer ausgelöst wird, sollte ich innerhalb der Timeout-Funktion aufgerufen werden, starten Sie die Funktion mit QObject :: killTimer und bevor die Funktion zurückgibt es mit QObject :: startTimer? – Talguy