Rekursion mit QTimer oder Alternativen?

Alles rund um die Programmierung mit Qt
Antworten
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

Rekursion mit QTimer oder Alternativen?

Beitrag von sacrif »

Hi,

in meinem Program möchte ich auf Knopfdruck eine Methode aufrufen, die zunächst ein widget mit bestimmten inhalten erstellt. Allerdings werden dazu berechnungen auf der grafikkarte durchgeführt.

Danach (nach einer kurzen Wartezeit) sollen werden die Daten im Widget dargestellt und sollen jetzt in ein QImage gespeichert werden (und auf die festplatte gespeichert).

Dann soll ich die funktion selbst wieder aufrufen und dass gleich weider mit neuen daten machen. Dh es werden wieder neue berechnungen auf der Graka durchgeführt und das Ergebnis dann in einem widget dargestellt und dann das widget als QImage gespeichert.

Der Relevante Code dazu sieht derzeit wie folgt aus:
Übrigens wird die funktion per knopfdruck mit "setTF(0)" aufgerufen.

Code: Alles auswählen

void MyWidgetClass::setTf(unsigned int index)
{
		QGradient gradient = myVector_[index]->getGradient(); 
		tfEditor_->setGradient(gradient);
		QTimer::singleShot(15000, this, SLOT(createThumbnail()));
		if(index+1 < myVector_.size())
		{
			QTimer::singleShot(16000, this, SLOT(setTf(index+1)));
		}
}
Das Problem ist jetzt dass zwar das erste QImage (also thumbnail) erstellt wird und auch gespeichert wird, danach wenn ich aber ruft sich die funktion aber nicht mehr selbst auf.

Wenn ich setTF(index+1) direkt, also ohne QTimer aufrufe lauft er in der rekursion weiter - nur bring mir das nichts, weil dann ja noch nicht die daten von der Graka fertig berechnet sind.
Gibts Ideen woran das liegen könnte, dass die Rekursion mit dem timer nicht funktioniert?

Bzw. gibts vielleicht noch andere möglichkeiten den Hauptprogramfluß anzuhalten während auf der Graka gearbeitet wird.

lg scr[/code]
drizzt
Beiträge: 29
Registriert: 9. Oktober 2009 13:37

Beitrag von drizzt »

du könntest doch, sobald fertig gerechnet und dargestellt ist, ein signal auslösen, welches dafür sorgt, das deine methode wieder aufgerufen wird.
dann hast du auch nicht das problem, dass du wissen musst, wann die berechnung fertig ist, wie das ja jetzt der fall sein sollte, wenn du nen Timer verwendest...
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

Beitrag von sacrif »

Hi, danke mal für die Antwort.
Dass hätte ich vielleicht noch dazu sagen sollen:
Die Berechnungen(also das rendern auf der Graka) werden nicht von meinem program selber durchgeführt, sondern von einem externen das ich nur bei mir eingebunden hab. Dh. ich weiss nicht obs da ein signal gibt das darauf hinweisst - das wär natürlich das einfachste. Aber bis ich näheres dazu weiss wärs gut wenn ich so eine Lösung hätte.

lg
drizzt
Beiträge: 29
Registriert: 9. Oktober 2009 13:37

Beitrag von drizzt »

Wo die Berechnungen stattfinden ist doch eigentlich egal oder?
Iwann kommen die Daten bei dir an und dann weißt du, dass du Neue schicken kannst. :wink:
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

Beitrag von sacrif »

Naja leider is es nicht ganz so einfach - denn ich wüste nicht wie ich automatisch prüfen kann ob die daten schon die richtigen sind - wie gesagt wird dass bild dass angezeigt wird auf der Grafikkarte gerenderd. Und wenn das normale Program in seinem Fluß weiter macht und also einen screenshot nachdem anderem von meinem widget macht und speichert dann würde ich zb. 10 mal hintereinander das das gleiche (nähmlich das erste angezeigte bild im widget als QImage bekommen) - weil die graka länger braucht als das restliche program auf der cpu. Dh, das restliche programm muss immer warten bis die graka das neue bild fertig gerendert hat und in mienem widget anzeigt, dann soll ein screeny vom widget gemacht werden und als png gespeichert werden.
Etwas verwirrend ich weiss :)

Gibts vielleicht noch Ideen?
Zuletzt geändert von sacrif am 3. März 2010 12:28, insgesamt 1-mal geändert.
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Eine Idee hätte ich.
Ist die Grafikkarte freilaufend?
Soll heissen: bearbeitet sie die Daten fortlaufend ohne Zutun oder musst Du ihr sagen, dass sie Daten verarbeiten soll?

Weiterer Vorschlag:
Kannst Du irgendwie die Grafikkarte abfragen, ob sie grad am Arbeiten ist oder ob sie mit dem einen Durchlauf fertig ist?
Linux, das längste Text-Adventure aller Zeiten
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

Beitrag von sacrif »

Naja, ich habe eine reihe von Werten als Input Parameter, die werden nach der reihe übergeben und die Graka erstellt für jeden Input Parameter das Bild. Nur sollte jetzt halt das restliche Programm auf der Cpu bei jedem Input Parameter warten bis der letzte fertig und als Bild gespeichert ist.

Wie ich die Graka abfragen könnte weiss ich leider nicht. Hab bisher nur von einer CUDA Funktion __syncthreads() gelesen, allerdings bin ich mir hier noch nicht so sicher ob die auch für CPU und Graka synchronisation funktioniert. Mal sehen - inzwischen danke für weitere Tipps :)
Antworten