我正在制作一个桌面编程游戏,包括C ++ 11,Qt 5.6(一旦V-Play支持它,很快就会有5.7)和QML。用户将能够编写任意代码来解决难题;但是,代码应该完全沙箱化,并且不会导致应用程序其余部分出现问题。
所以我实例化一个脚本引擎,它的环境我完全控制并通过它运行播放器的代码。我不会说什么脚本引擎,因为我不希望解决方案依赖于引擎(另外,我可能支持多种语言)。当玩家点击“提交”时,我会异步运行脚本,以便游戏的其余部分仍然响应。
但是这是我的问题:如果玩家的代码需要很长时间才能运行会怎么样?或者更糟糕的是,如果它是一个无限循环怎么办?玩家会在他们学习时犯错误,所以“他们不应该这样做”不 a这里有效答案。
所以我会让玩家随意终止他们的代码,很好。 但是我怎么能这样做而不会冒未定义的行为,内存泄漏,崩溃或其他可能对游戏产生负面影响的事情?
相关性如下:
QtConcurrent::run
返回的QFuture
不支持QFuture::cancel
。答案 0 :(得分:5)
您不能依赖能够安全地杀死C / C ++线程。任何进行任何有意义工作的线程都需要获取锁和/或分配内存来完成其工作;杀死线程可能会永久保留一些锁,或者永远不会释放内存。根据细节,这可能会导致应用程序在许多脚本被杀死后耗尽内存,或者如果主线程尝试获取被解雇的解释器线程持有的锁,则会导致应用程序完全锁定。
如果您需要能够中断正在运行的脚本,则需要选择特别允许此操作的脚本引擎。不是所有人都会;你需要避免那些不支持它的人。