Seite 1 von 1

Signal Slot Frage

Verfasst: 5. Dezember 2011 17:17
von JohnR
Auch wenn es für manchen QT Profi hier sicher ein leichtes ist....., ich bin halt noch Anfänger und habe hier und da noch "kleine" Verständnisproblemchen :D

Meine Frage

Ich habe zwei Funktionen also bsp.

void Testprogramm:FunktionA()

und

void Testprogramm:FunktionB()

beide werden über einen Button connected, Funktion a soll in diesem Bsp. Werte aus einer Liste auslesen und diese an eine Webseite übermitteln, das ganze dann weiter verarbeiten.......

Funktion b soll die Werte die Funktion A in einer QStringlist abgelegt hat mit lokalen Listen abgleichen und die Ergebnisse ausgeben.

Das ganze funktioniert auch super, aber das Problem ist das wenn alle 2 Funktionen über den Button connected werden ist Funktion A noch beschäftigt und Funktion B bringt 0 Ergebnisse weil ihr die Hälfte der Daten noch fehlt (diese müßte Funktion A ja liefern).

Konkret suche ich eine Möglichkeit am Ende von Funktion A Funktion B per Connect ein Signal zu senden und diese dann aufzurufen, dann wäre Funktion A mit allen durch und Funktion B könnte das ganze weiter bearbeiten.

Ich bin mir relativ sicher das die Lösung recht simpel ist und hier wieder für :roll: sorgt, aber ich steh mit der Sache echt auf dem Schlauch O.o

Gruß John

Re: Signal Slot Frage

Verfasst: 5. Dezember 2011 18:27
von franzf
Wenn Funktiona blockierend ist, gibt es kein Problem. Du hast aber irgend eine asynchrone Verarbeitung drinnen, die in Funktiona angestoßen wird. Funktiona beendet dann, während im Hintergrund weiter gearbeitet wird.
Was da bei dir asynchron läuft, kann man ohne Code nicht sagen.
Da FktA und FktB Member deiner Klasse sind brauchst du doch kein Signal! Da reicht ein simpler bool, der anzeigt, ob FktA gerade rechnet oder schon fertig ist.

Re: Signal Slot Frage

Verfasst: 5. Dezember 2011 20:19
von bbt
Wenn ich das richtig verstehe, soll nach dem auf den Button geklickt wurde erst Funktion A ihre Arbeit erledigen, und dann Funktion B aufgerufen werden. Wieso rufst du denn dann nicht einfach am Ende von Funktion A Funktion B auf?

Re: Signal Slot Frage

Verfasst: 6. Dezember 2011 11:17
von RHBaum
wenn ich signal C mit funktion A und funktion B verbinde, ist dann die reihenfolge überhaupt definiert ? Glaub eher ned oder ? auch wenn es sich um direkte verbindungen handelt ?

Ansonsten denk ich schon, dass er aqssyncronitaet in A drinne hat ...
Werte aus einer Liste auslesen und diese an eine Webseite übermitteln, das ganze dann weiter verarbeiten.......
klingt zumindest danach ...

Ciao ...

Re: Signal Slot Frage

Verfasst: 6. Dezember 2011 11:49
von brax
RHBaum hat geschrieben:wenn ich signal C mit funktion A und funktion B verbinde, ist dann die reihenfolge überhaupt definiert ? Glaub eher ned oder ? auch wenn es sich um direkte verbindungen handelt ?
Doch die Reihenfolge ist dieselbe, in der die connects aufgerufen wurde (jedenfalls laut Qt-Docu und meiner Erfahrung).
Qt-Docu-4.6 hat geschrieben: If a signal is connected to several slots, the slots are activated in the same order as the order the connection was made, when the signal is emitted.
Dies ist allerdings (wieder laut Docu) erst seit 4.6 der Fall, in der 4.5er Docu steht noch:
Qt-Docu-4.5 hat geschrieben: If a signal is connected to several slots, the slots are activated in an arbitrary order when the signal is emitted.
Passiert im Slot a vielleicht ein processEvents? Dann würde (denke ich) Slot b "zu früh" aufgerufen werden.

Re: Signal Slot Frage

Verfasst: 6. Dezember 2011 18:05
von JohnR
Hi

Danke erstmal für die Hilfe, das Problemchen habe ich mittlerweile in den Griff bekommen.

Zu Funktion A, diese nutzt den QNetworkaccessmanager und downloaded damit eine Liste, gibt diese dann an bspw. Funktion A1 weiter, diese macht einfach ein append zur lokalen Liste und filtert danach die Duplikate, so bin ich immer auf dem neuesten Stand.Dann wiederum werden in der gedownloadeden Liste Werte mit einer lokalen Verglichen und Treffer wenn vorhanden in einer weiteren abgespeichert.

Ob da was asynchron dran ist O.o , sorry ich weiss es einfach nicht, beschäftige mich ja auch erst ca. 6 Wochen mit C++.

Im Moment habe ich es so gelöst das ich das ganze an eine if Kontrollstruktur gebunden habe, also Funktion a wird aufgerufen und erhöht am Ende einen simplen Zähler um eins (könnte natürlich auch bool sein), wenn der Zähler wert 1 erreicht hat erfüllt er die Bedingung und Funktion B wird aufgerufen, so stelle ich dann sicher das Funktion A fertig ist bevor Funktion B startet.

geht sicher auch eleganter, aber wie gesagt ich lerne ja noch .....

Gruß John