запретить sleep_for блокировать фоновый поток

Я пишу на чистом c ++ 11 и хочу просто «подождать x секунд и включить переменную-член» после ее отключения. Переменная-член класса в этом примере является флагом для «анимации».

        cout << "stop animating!" << endl;
this->animating = false;

async(launch::async, [this] ()
{
this_thread::sleep_for(chrono::seconds{8});
this->animating = true;
std::cout << "start animating!" << std::endl;
});
cout << "i'm here" << endl;

this_thread :: sleep_for блокирует продолжение всей программы (даже если она находится в асинхронном потоке). потому что я не вижу «я здесь» 8 секунд спустя. Если бы приведенный выше код работал как задумано, я бы увидел «Я здесь» сразу после «Остановить анимацию». Эта блокировка является проблемой для меня, потому что она блокирует все, что мне нужно, например, продолжает обрабатывать «ввод», например, события клавиатуры, и программа также останавливает «рисование» других объектов на экране.

Кто-нибудь знает, как добиться простого отложенного и асинхронного изменения переменной-члена, используя стандарт C ++ 11 (пожалуйста, никаких фреймворков, таких как boost)

в iOS это очень просто:

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC),
dispatch_get_main_queue(), ^
{
//do whatever, 10 seconds later
});

2

Решение

Согласно комментарию @ user2176127 — вы пробовали это? :

cout << "stop animating!" << endl;
this->animating = false;

std::thread delay_thread(
[this]() {
this_thread::sleep_for(chrono::seconds{8});
this->animating = true;
std::cout << "start animating!" << std::endl;
}
);
delay_thread.detach();
std::cout << "I'm here" << std::endl;

Также обратите внимание, что вам, вероятно, нужно animating член в std::atomic<>, то есть если бы это было bool теперь это становится std::atomic<bool>, чтобы гарантировать, что ваш основной поток замечает изменения, когда они действительно происходят. (С помощью volatile не поможет.)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]