Programmablauf für effizientes Multithreading

Werner83

Grünschnabel
Hallo,
ich grabbe mit opencv frames von 3 Kameras (je kamera 32 frames pro sec) und möchte diese, alle 32 Fames bearbeiten. Mit bearbeiten meine ich sehr rechenaufwendige Bildverarbeitung. Wenn ich das chronologisch mache dann verpasse ich natürlich ein paar frames während der Bearbeitung, die ich nicht grabben kann. Jetzt wollte ich wissen wie ich es mit threads am effizientesten hinbekomme. Ich hatte mir gedacht den Grabber-Thread mit einer niedrigen Priorität durchlaufen zu lassen und den Bildverarbeitungs-Thread schlafen zu lassen, bis 32 frames zusammen gekommen sind. Danach wollte ich den Bildverarbeitungs-Thread mit hoher Priorität seinen Job machen lassen. Ist das so am besten, oder gibt es bessere wege? Habe mal gehört das sleep() nicht wirklich toll ist für thread programmierung...

Das komische ist wenn ich meinen Threads prioritäten zuweise (THREAD_BASE_PRIORITY_MAX und THREAD_BASE_PRIORITY_IDLE) und sie ne Schleife zählen lasse ist der mit der höheren Priorität nur minimal schneller als der mit der niedrigeren... ist das normal?

Und noch eine Frage, kann man Windows 7 so einstellen, dass es so wenig wie möglich rssourcen in anspruch nimmet und den grossteil der CPU für mein Programm zur verfügung stellt? Ich möchte windows während mein Programm läuft eigentlich gar nicht nutzennutzen.
 
Hi.
Hallo,
ich grabbe mit opencv frames von 3 Kameras (je kamera 32 frames pro sec) und möchte diese, alle 32 Fames bearbeiten. Mit bearbeiten meine ich sehr rechenaufwendige Bildverarbeitung. Wenn ich das chronologisch mache dann verpasse ich natürlich ein paar frames während der Bearbeitung, die ich nicht grabben kann. Jetzt wollte ich wissen wie ich es mit threads am effizientesten hinbekomme. Ich hatte mir gedacht den Grabber-Thread mit einer niedrigen Priorität durchlaufen zu lassen und den Bildverarbeitungs-Thread schlafen zu lassen, bis 32 frames zusammen gekommen sind. Danach wollte ich den Bildverarbeitungs-Thread mit hoher Priorität seinen Job machen lassen. Ist das so am besten, oder gibt es bessere wege?
Es gibt verschiedene Methoden der Thread-Kooperation.

Du könntest z.B. Condition Variables verwenden. Siehe http://msdn.microsoft.com/en-us/library/ms682052(VS.85).aspx

Du weckst dann einen der wartenden Threads nur auf wenn genug Arbeit vorhanden ist.

Es würde sich anbieten genauso viele Threads zu starten wie CPU Kerne vorhanden sind.

Allerdings solltest du dir überlegen wie du doch ein paar Frames überspringen kannst falls du mit der Verarbeitung der Daten nicht so schnell nachkommst.

Verschiedene Prioritäten zu verwenden kann evtl. nach hinten losgehen, da wenn hochpriorisierte Threads vorhanden sind, die Threads mit niedrigerer Priorität nie zum Zuge kommen.
Das komische ist wenn ich meinen Threads prioritäten zuweise (THREAD_BASE_PRIORITY_MAX und THREAD_BASE_PRIORITY_IDLE) und sie ne Schleife zählen lasse ist der mit der höheren Priorität nur minimal schneller als der mit der niedrigeren... ist das normal?
Du hast doch nicht etwa in der Schleife irgendetwas ausgegeben, oder?!
Und noch eine Frage, kann man Windows 7 so einstellen, dass es so wenig wie möglich rssourcen in anspruch nimmet und den grossteil der CPU für mein Programm zur verfügung stellt? Ich möchte windows während mein Programm läuft eigentlich gar nicht nutzennutzen.
Das sollte man nicht unbedingt tun. Siehe http://msdn.microsoft.com/en-us/library/ms685100(v=vs.85).aspx

Gruß
 
Erstmal vielen Dank für die Infos, die helfen mir wirklich weiter...
Um die Thread prioritäten zu testen habe ich nach einigen schleifen durchläufen, den wert der variable auf die konsole ausgegeben... damit blcoken sich die threads doch nicht etwa..?
 
Erstmal vielen Dank für die Infos, die helfen mir wirklich weiter...
Um die Thread prioritäten zu testen habe ich nach einigen schleifen durchläufen, den wert der variable auf die konsole ausgegeben... damit blcoken sich die threads doch nicht etwa..?
I/O ist so ziemlich das Langsamste was in einem Computer vor sich geht.

D.h. die Threads berechnen gar nichts sondern warten (beide) die meiste Zeit auf die Ausgabe.

Du solltest schon irgendwie die Zeit messen, die die Threads insgesamt zum Hochzählen brauchen.

Falls du natürlich einen Mehrkernrechner hast, läuft der eine Thread auf dem einen, der andere Thread auf dem anderen Kern - was dann auch dazu führt das die Ausführungszeit sich nicht sonderlich unterscheidet.

Gruß
 
Zurück