gui aktualisierung aus thread heraus

Alles rund um die Programmierung mit Qt
NothingSpecial
Beiträge: 28
Registriert: 5. Juli 2009 16:06

Beitrag von NothingSpecial »

nochmal ein Update:

Da ich ja wie gesagt an einer ähnlichen Aufgabe bastle, vielleicht nochmal kurz meine Benchmarks. Ich lasse immer noch ohne Kamera folgendes in meinen zwei Threads machen:

Thread 1 (Main Thread/GUI):
1000x einen fertigen unsigned char* von Thread 2 nehmen und in einem QImage anzeigen:

Code: Alles auswählen

memcpy(image->bits(),buffer,sizeof(unsigned char)*3*image->width()*image->height());
Thread 2 (Bildverarbeitungssimulation):
In einer Endlosschleife 100 Bilder immer wieder neu "aufbereiten" und in einen Triple Buffer laden.

Fest steht: Zum Anzeigen ist das QImage auf einem Label eindeutig schnell genug. Auf meinem Rechner brauche ich für das Anzeigen der 1000 640x480 RGB Bilder nur 8 Sekunden! Das macht mehr als 100 fps! Deutlich wird aber, dass das Anzeigen länger dauert, als die Bilder im Buffer nachgeladen werden, denn viele Bilder werden zwischendurch ausgelassen.


Grüße,

NothingSpecial
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

Wo steht dass bei einer normalen Thread->Thread-Connection (=Qt::QueuedConnection) der Aufrufer blockiert wird?
Wenn ich mich nicht ganz irre werden die aufgerufenen slots in dem Thread der das signal emittet ausgeführt. Das heisst sobald der Thread ein signal schickt und slot ausgeführt wird, wird dir run funktion so lange ausser gefecht gesetzt bis der thread den slot bearbeitet hat. Egal welchen Connection-Typ man angibt.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

KernelPanic hat geschrieben:
Wo steht dass bei einer normalen Thread->Thread-Connection (=Qt::QueuedConnection) der Aufrufer blockiert wird?
Wenn ich mich nicht ganz irre werden die aufgerufenen slots in dem Thread der das signal emittet ausgeführt.
Das wäre irgendwie ein GAU in Sachen Threadprogrammierung.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Wenn ich mich nicht ganz irre werden die aufgerufenen slots in dem Thread der das signal emittet ausgeführt. Das heisst sobald der Thread ein signal schickt und slot ausgeführt wird, wird dir run funktion so lange ausser gefecht gesetzt bis der thread den slot bearbeitet hat. Egal welchen Connection-Typ man angibt.
Genau wie pfid schon sagte: völliger quatsch. Die Connection-Types funktionieren über Threads hervorragend und genau so wie in der Doku beschrieben.
mustermann.klaus
Beiträge: 23
Registriert: 6. April 2009 12:21
Wohnort: Berlin

Beitrag von mustermann.klaus »

@NothingSpecial

Ich bewerkstellige das mit der Kamera mittels OpenCv. Genauer OpenCV_1.0rc1.exe

Dazu benötigt man das MS SDK, da Direct Show nicht mehr im DirectX enthaltren ist. Ich habe Erfolg mit dem SDK:

http://www.microsoft.com/downloads/deta ... laylang=en

Das Tool erklärt sich leider nicht so gut von selbst, die Doku ist eher mangelhaft, aber die Ergebnisse stimmen.
NothingSpecial
Beiträge: 28
Registriert: 5. Juli 2009 16:06

Beitrag von NothingSpecial »

Danke für den Tipp aber ich benutze eine Industriekamera. Vor dem "Umstieg" auf Qt oder eher vor dem Begin der Realisierung der GUI haben wir eine hässliche Bibliothek von National Instruments genommen, die aber nicht mit dem gcc zusammen arbeitet (und abgesehen von der Bildakquirierung sowieso nutzlos ist). Jetzt liegt die Hoffnung auf dem Originaltreiber/SDK der/das mittlerweile für Windows und Linux zu haben ist und hoffentlich mit dem gcc kompilierbar ist.
DirectShow würde ich im übrigen Meiden, die Doku dazu ist absolut grottig. Meine erste Idee war auch die Anzeige mit DirectX zu realisieren, bis ich gemerkt habe, dass MS jede Dokumentation zu DirectX <10 von MSDN entfernt hat! Willst du also in die Tiefe gehen benutz lieber openGL! Ich glaube dass openCV auch ohne Grafikframework auskommt und dir die Bilddaten als unsigned char array ausgibt. Wenn du damit nicht zurecht kommst, schreib ne PM ich erklär dir wie die Daten aufgebaut sind. Ich denke das würe den Rahmen hier sprengen.


Grüße,

NothingSpecial
mstein
Beiträge: 3
Registriert: 20. Juli 2009 16:02

Beitrag von mstein »

Hi,

ich bin neulich über diesen Artikel gestolpert:

http://www.morethantechnical.com/2009/0 ... -qwidgets/

Vielleicht hilft dir das weiter.

Grüße
mstein
Antworten