WaitForSnap mit mehreren Grabbern

LabVIEW, mvAcquireControl

Bei der Applikationsentwicklung mit dem mvAcquireControl-SDK und der Verwendung
von mehreren Frame Grabbern ist bei der Verwendung der Funktion SnapAsync(0) Vorsicht geboten:
Beim Übergabeparameter 0 wird ein internes Event für die Signalisierung des Abschlusses
der Bilderfassung verwendet. Dieses Event ist automatisch rücksetzend deklariert.
Arbeitet man also mit mehreren Karten gleichzeitg, kann folgende Situation eintreten:

TASnapResult snapRes1, snapRes2;
while(m_boLoop)
{
m_firstAcqcontrol->GetIGrabber()->SnapAsync(0);
m_secondAcqcontrol->GetIGrabber()->SnapAsync(0);
while( !(m_firstAcqcontrol->GetIGrabber()->WaitForSnap(0, &snapRes1, sizeof(TASnapResult) ) ) || !(m_secondAcqcontrol->GetIGrabber()->WaitForSnap(0, &snapRes2, sizeof(TASnapResult) ) )
{
Sleep(SLEEP_TIME);
}
RefreshView(m_imageWindow1.m_hWnd);
RefreshView(m_imageWindow2.m_hWnd);
}

Ist nun der erste Grabber ist fertig, liefert also TRUE,
der 2. aber noch nicht -> FALSE bleibt man weiter in der Schleife...

Ab dem nächsten Durchlauf lässt sich diese nun nicht mehr verlassen, da ja das Event
vom 1. Grabber zurückgesetzt ist und auch erst wieder gesetzt wird,
wenn das nächste Bild fertig ist. Von hier käme also jetzt immer FALSE.

Stellt man die Anwendung um (indem man einfach ein Flag für jedes der beiden Waits setzt,
wenn man einmal TRUE bekommt und dann auf die beiden Flags prüft) funktioniert die Schleife wieder:

TASnapResult snapRes1, snapRes2;
while(m_boLoop)
{
m_boFirstGrabberReady = m_boSecondGrabberReady = FALSE;
m_firstAcqcontrol->GetIGrabber()->SnapAsync(0);
m_secondAcqcontrol->GetIGrabber()->SnapAsync(0);
while( !(m_boFirstGrabberReady & m_boSecondGrabberReady) )
{
Sleep(SLEEP_TIME);
if( m_firstAcqcontrol->GetIGrabber()->WaitForSnap(0, &snapRes1, sizeof(TASnapResult) ) )
m_boFirstGrabberReady = TRUE;
if(m_secondAcqcontrol->GetIGrabber()->WaitForSnap(0, &snapRes2, sizeof(TASnapResult) ) )
m_boSecondGrabberReady = TRUE;
}
RefreshView(m_imageWindow1.m_hWnd);
RefreshView(m_imageWindow2.m_hWnd);
}

LABVIEW:
Gleiches gilt für die Verwendung der "Virtuellen Instrumente" (unter LabVIEW)
"MV_SnapAsync.vi", "MV_WaitForSnap.vi", "MV_DualSnapAsync.vi", "MV_GetAsyncImage.vi" und "MV_GetImage.vi":

Es ist darauf zu achten, dass bei einer ähnlichen Situation wie der oben beschriebenen
entweder in 2 separaten Schleifen (eine für jeden Grabber) auf die Fertigstellung
der Bilder gewartet wird (siehe hierzu das Beispiel "MV_Test_DualSnapAsync.vi"),
oder aber irgendeine Art von boolschen Flags in LabVIEW realisiert wird, die obigem Beispiel entspricht.

Zurück