c++ - kav60 - driver camara acer aspire one windows 7
¿Cómo implementar un bloqueo de cuenta atrás en Qt? (1)
Aquí hay una implementación que aprovecha QSemaphore
:
// https://github.com/KubaO/stackoverflown/tree/master/questions/countdown-latch-38362044
#include <climits>
#include <QSemaphore>
class CountDownLatch {
Q_DISABLE_COPY(CountDownLatch)
QSemaphore m_sem{INT_MAX};
public:
CountDownLatch() {}
~CountDownLatch() {
m_sem.acquire(INT_MAX);
m_sem.release(INT_MAX);
}
class Locker {
CountDownLatch * sem;
public:
Locker(const Locker & other) : sem{other.sem} { sem->m_sem.acquire(); }
Locker(Locker && other) : sem{other.sem} { other.sem = nullptr; }
Locker(CountDownLatch * sem) : sem{sem} { sem->m_sem.acquire(); }
~Locker() { if (sem) sem->m_sem.release(); }
};
Locker lock() { return Locker{this}; }
};
Para usar, mantenga una instancia de CountdownLatch::Locker
mientras desea que el bloqueo permanezca bloqueado. El destructor del pestillo se bloqueará hasta que se destruyan todos los casilleros.
#include <QtConcurrent>
struct MyClass {
CountDownLatch m_latch;
MyClass() {
auto lock = m_latch.lock(); // must be taken here
QtConcurrent::run([this, lock]{
// DON''T lock here, you''ll have a race!
QThread::sleep(10);
});
}
};
int main() {
MyClass a;
}
La instancia a
se mantendrá hasta que el trabajador concurrente finalice, es decir, durante 10 segundos.
Un pestillo de cuenta regresiva (también conocido como CountDownLatch ) es una primitiva de sincronización que asegura que todos los recursos utilizados se liberan antes de que se destruya la primitiva. Es como un QSemaphore
, pero funciona al revés: queremos bloquear no para adquirir un recurso, sino para garantizar que todos ellos hayan sido liberados.
¿Cuál sería una forma fácil de implementarlo en Qt?