Callback-Funktion aus For-Schleife abwarten


#1
Hallo allerseits,

mich quält gerade folgendes Problem:

Ich schreibe zur Zeit eine VCL-Anwendung zur Ansteuerung einer Digitalkamera. Die damit verbundenen Bibliotheken verwenden Callbackfunktionen. Wenn ich also beispielsweise ein Bild schiesse, rufe ich dazu die Funktion Capture(..) auf. Die dll ruft dann praktischerweise zurück, indem sie die Funktion ImageReady(..) aufruft, um mitzuteilen, dass das Bild heruntergeladen werden kann.

Jetzt möchte ich aber viele Bilder hintereinander schiessen .. am liebsten mit einer for-Schleife:

Code:
for (int i=0; i<10; i++) 
{
Capture(..);
Sleep(2000); // Warten bis Bild fertig ist .. funktioniert nicht, da Single-Thread
}
Bei der for-Schleife kommt die Kamera natürlich nicht hinterher. Ich weiss gar nicht, ob ImageReady überhaupt aufgerufen wird, oder ob zuerst die for-Schleife abgearbeitet wird.

Ich würde ja einfach mit Sleep warten bis die Kamera wieder bereit ist, aber da meine Anwendung Single-Thread ist, passiert in der Zwischenzeit nichts .. die Anwendung widmet sich voll und ganz dem Schlaf.

Wie kann ich das Problem möglichst einfach und zügig lösen?

Vielen Dank schon mal

PaRoX
 
Zuletzt bearbeitet:

Supa

Erfahrenes Mitglied
#2
Hy,

kannst du ImageReady() nicht überschreiben? Dann lös doch dort einfach nochmal Capture() aus. So stellst du sicher, das die Bearbeitung des ersten Bildes auch vollständig ist.

mfg
 
#3
Hmmh ..

also ImageReady ist ja eine Funktion in meinem Code. Die Kamera-dll ruft nur eben diese Funktion auf, sobald das Bild heruntergeladen werden kann.

so sieht ImageReady aus ..

Code:
LONG32 CALLBACK ImageReady(ULONG32 lCam, ULONG32 ulObjHandle, void* pParam)
{
	LONG32 lRet = 0;
	lRet = DownloadImage(lCam, ulObjHandle);
	return lRet;
}
und DownloadImage gibt es nur im Pseudocode ..

Code:
LONG32 DownloadImage(ULONG32 lCam, ULONG32 ulObjHandle)
{
	LONG32 lRet = 0;
        
        // ... Lade Bild herunter ..

	return lRet;
}

Die prozedurale Reihenfolge schaut so aus:

Capture-Befehl an Kamera-dll -> Kamera-dll ruft ImageReady auf (Callback) -> ImageReady ruft DownloadImage auf ( Bild wird heruntergeladen ) -> fertig

Zum Aufruf von Capture:
Ich schätze du meinst ich sollte die Funktion nochmals aufrufen sobald das Bild heruntergeladen wurde .. also in meinem Fall in DownloadImage. Ich denke das werde ich mal probieren.