Я делаю настольную игру для программирования с C++ 11, Qt 5.6 (скоро 5.7 раз, когда поддерживает V-Play) и QML. Пользователь сможет писать произвольный код для решения головоломок; однако код должен быть полностью изолирован, а не вызывает проблемы с остальной частью приложения.Как надежно убить поток в Qt/C++?
Поэтому я создаю экземпляр сценария, окружение которого я полностью контролирую и управляю кодом игрока. Я не буду говорить, какой скриптовый движок, потому что я не хочу, чтобы решение опиралось на двигатель (плюс, я могу поддерживать несколько языков). Когда игрок нажимает «Отправить», я запускаю сценарий асинхронно, так что остальная часть игры все еще реагирует.
Но вот моя проблема: Что произойдет, если код игрока займет много времени? Или, что еще, если это бесконечный цикл? Игрок будет делать ошибки, поскольку они учатся, поэтому «они не должны этого делать» не действительный ответ здесь.
Так что я просто позволю игроку закончить свой код по своему усмотрению, отлично. Но как я могу это сделать, не рискуя неопределенным поведением, утечками памяти, сбоем или другими вещами, которые могут негативно повлиять на игру?
Актуальными является следующее:
- Решение должно быть мультиплатформенной.
- Решение должно быть не зависит от того, какой скриптовый движок я использую.
- Я не передаю данные между потоками, поэтому мне не нужно беспокоиться о гонках данных.
QFuture
sQtConcurrent::run
не поддержкаQFuture::cancel
.
Если вы хотите настоящую песочницу, вам нужно использовать отдельные процессы, как это реализовано в хроме. –