Я пишу на чистом 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
});
Согласно комментарию @ 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
не поможет.)
Других решений пока нет …