Signal Slot Frage

Alles rund um die Programmierung mit Qt
Antworten
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Signal Slot Frage

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Signal Slot Frage

Beitrag 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.
bbt
Beiträge: 29
Registriert: 2. Februar 2010 19:21

Re: Signal Slot Frage

Beitrag 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?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Signal Slot Frage

Beitrag 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 ...
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Signal Slot Frage

Beitrag 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.
JohnR
Beiträge: 42
Registriert: 3. Dezember 2011 12:23

Re: Signal Slot Frage

Beitrag 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
Antworten