В приложении создаётся второй поток в котором вызывается конструкция std::this_thread::sleep_for( … )
.
Можно ли как то прервать этот sleep_for
из другого потока имея экземпляр std::thread
? Я понимаю что можно сделать флаг, запустить в цикле std::this_thread::sleep_for(std::this_thread::sleep_for(std::chrono::microseconds(1))
и на каждой итерации проверять флаг, но в моём случае большой оверхэд недопустим. И ещё если кто знает, можно ли как-то вызвать sleep_for соседнего потока?
using std::cout;
using std::endl;
using namespace std::chrono_literals;
std::mutex mut{};
void Foo1() {
std::lock_guard<std::mutex> lock (mut);
std::this_thread::sleep_for(std::chrono::seconds(10));
}
void main() {
cout << "---- point 1 ----" << endl;
std::thread th1(Foo1);
// Вот тут надо прервать текущий sleep_for в th1.
th1.join();
cout << "---- point 2 ----" << endl;
system("PAUSE");
}
В общем как сказал @VTT выше, тут необходимо применить std::condition_variable и вместо sleep_for использовать wait_for. Вот так изменится код примера:
using std::cout;
using std::endl;
using namespace std::chrono_literals;
std::mutex mut;
std::condition_variable condition;
void Foo1() {
std::unique_lock<std::mutex> lock(mut);
condition.wait_for(lock,std::chrono::seconds(10)); // Блокирует поток на 1 секунду либо до срабатывания condition.notify_one().
}
void main() {
cout << "---- point 1 ----" << endl;
std::thread th1(Foo1);
condition.notify_one(); //Прерываем condition.wait_for в th1.
th1.join();
cout << "---- point 2 ----" << endl;
system("PAUSE");
}
возникла необходимость отображения непрозрачной графики на прозрачном Jframe c использованием BufferStrategy (если это вообще возможно)
Пытаюсь задеплоить на Wildfly сервер проектПри деплоинге war файла происходит ошибка