2017-04-26 3 views
0

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.

+0

Vielleicht möchten https://stackoverflow.com/documentation/c%2b%2b/699/threading/13552/using-condition-variables#t=201704260920460644225 auszuchecken – JVApen

Antwort

0

Sie können einen neuen Thread t1 auslösen und dann t1.join() aufrufen. Legen Sie die Funktion t1 fest, die zurückgegeben werden soll, wenn der Rückruf abgeschlossen ist.

What does this thread join code mean?

Verwandte Themen