我在 C# 中使用 VB .NET 4 在 VS2010 中创建了一个游戏。游戏为每个玩家创建一个线程,并运行玩家创建的 LUA 代码。
每个 LUA 代码都为线程阻塞,并且只应在线程终止时终止(LUA 脚本应包含无限循环)
我想限制 CPU 使用率,因为计算机在以 100% CPU 运行几个小时后当前过热。
如何在不控制线程的情况下限制线程?我希望有一个线程管理器来强制挂起/恢复,但那些已经过时了,我不想抛出异常,因为这会中止我正在执行的 LUA 代码。
有任何想法吗?
谢谢!
我在 C# 中使用 VB .NET 4 在 VS2010 中创建了一个游戏。游戏为每个玩家创建一个线程,并运行玩家创建的 LUA 代码。
每个 LUA 代码都为线程阻塞,并且只应在线程终止时终止(LUA 脚本应包含无限循环)
我想限制 CPU 使用率,因为计算机在以 100% CPU 运行几个小时后当前过热。
如何在不控制线程的情况下限制线程?我希望有一个线程管理器来强制挂起/恢复,但那些已经过时了,我不想抛出异常,因为这会中止我正在执行的 LUA 代码。
有任何想法吗?
谢谢!
您可以将这些线程的线程优先级设置为低 - 这将有助于您的系统保持响应......但您仍然会使用 100% CPU 并且仍然过热,所以我不会详细说明如何。
正如其他海报所提到的,你需要让你的线程插入小睡眠。如果您根本无法控制它们,那么您将无能为力。
我建议您需要更改游戏 API。
我建议您让 Lua 代码具有“运行一帧”功能,而不是让您的代码一次调用 Lua 代码,然后 Lua 代码无限循环。然后,您将无限循环移动到您自己的代码中,并重复调用“运行一帧”函数。
这样,您可以插入睡眠、添加日志记录以及执行各种其他有用的事情。
确保无限循环中的线程不会消耗太多 cpu 的典型方法是让它在每次迭代中休眠一点(通常 5 毫秒就可以了)。这将使系统有时间允许其他资源使用 cpu。另外,不要给线程最高优先级。
控制执行线程调度的经典方法是使用 Fibers。
然而,Fibers 是 WIN32 API 的一个原生特性……你可以在 C# 中最接近的是使用迭代器……你在每个产量之间做一些工作……但你决定何时需要下一个通过调用迭代器来完成一些工作。
请参阅第二个链接...可能是一种使用非托管本机 Fiber API 来包装一些 .NET 协程的方法,或者如果您在此线程中运行的 LUA 代码是本机的并且您无权访问源代码。 .那么您也许可以使用 ConvertThreadToFibre 来控制它(并决定何时使用 Fiber API 调用的一些互操作来安排它)。
http://paoloseverini.wordpress.com/2012/02/02/implementing-iterator-blocks-in-c-part-2-win32-fibers/
http://www.altdevblogaday.com/2011/05/25/implementing-fibers-in-c/
http://www.altdevblogaday.com/2011/02/01/slim-and-light-multitasking-with-fibers/
或者你可以有一个调度线程,它使用事件向玩家线程发出信号,当他们可以继续并做一些工作时(如果你的一些代码是本机/C++,一些是 C#,那么每个都可以引用相同的事件句柄...... .just 在每一位代码中使用 WIN32API 或 .NET API)。