Ich verwende eine API, die mit Videokamera-Geräten kommuniziert. Mein Ziel ist es, einen Schnappschuss mit dem Gerät zu machen.Beenden eines Threads von einer Callback-Funktion in C++ 11
Die API funktioniert mit Rückrufen. Sie verbinden eine Rückruffunktion mit der gewünschten Funktionalität. In diesem Fall Snapshots erstellen.
Die Funktionen für so etwas so aussehen tun ...
MEDIALIB_SETSNAPCB(this, snapcb); // connect snapshot callback to callback function snapcb
MEDIALIB_TAKESNAP(device_nr, channel); // take snapshot of specified channel
Das Problem ist, dass ich für die Callback-Funktion warten müssen snapcb
vor dem Beenden des Programms zu reagieren. snapcb
kann bis zu 50 Sekunden dauern, um nach der Ausführung von MEDIALIB_TAKESNAP
zu antworten, was nicht darauf wartet, dass der Rückruf abgeschlossen wird, bevor zur nächsten Zeile gegangen wird.
Hier ist eine abgespeckte Version:
...
int Snapshot::takeSnap()
{
MEDIALIB_SETSNAPCB(this, snapcb); // connect snapshot callback to callback function snapcb
CString device_nr = "TC1234";
int channel = 1;
MEDIALIB_TAKESNAP(device_nr, channel); // take snapshot of specified channel
return 0;
}
void Snapshot::snapcb(const char* device_nr, int channel, const char* pBuf, int nLen, void* pUsr)
{
Snapshot* pThis = (Snapshot*)pUsr;
pThis->snapdatacb(device_nr, channel, pBuf, nLen);
}
void Snapshot::snapdatacb(const char* device_nr, int channel, const char* pBuf, int nLen)
{
// ... create file on computer ...
}
...
I MEDIALIB_TAKESNAP(device_nr, channel);
in einem Thread laufen und dann eine bedingte Variable für, wenn der Rückruf zurückkehrt gedacht haben abfeuern, aber nicht gelungen, ein Beispiel dafür, wie man finden Verwenden Sie in dieser Situation eine bedingte Variable.
Jede Hilfe würde sehr geschätzt werden. Bitte kommentieren Sie auch, wie ich meine Frage strukturiert habe, da ich immer noch lerne, wie man eine Frage zu Stackoverflow stellt.
Vielleicht möchten https://stackoverflow.com/documentation/c%2b%2b/699/threading/13552/using-condition-variables#t=201704260920460644225 auszuchecken – JVApen