我有一个应用程序,允许用户使用我们自己的语言编写自己的代码,这有点像C ++。然而,我们遇到了问题,有时候我们的用户会不小心在脚本中编写无限循环。一旦脚本进入无限循环,它们可以退出的唯一方法是关闭应用程序并重新启动,可能会丢失它们的工作。我想添加一些方法,当用户意识到他的代码处于无限循环时,可以点击特殊键,如F10或其他东西,并且代码将突破循环。但我想在脚本运行时没有实现大量检查的情况下这样做。最理想的情况是,我希望有一个单独的“调试器”线程,它主要是空闲的,但作为其任务之一,它会侦听F10键,当它获得F10键时,它将导致脚本运行时线程抛出异常,以便它将停止执行脚本。所以我的问题是,有没有办法让一个线程导致另一个线程抛出异常?我的应用程序是用C ++编写的。
答案 0 :(得分:2)
如果您的应用程序实际解释了脚本,那么您可以告诉解释器在发生某些用户事件时停止执行。
答案 1 :(得分:1)
这是可能的。例如,在单独的线程,隐藏窗口和WM_HOTKEY中检测击键。调用SuspendThread()来冻结解释器线程。现在使用GetThreadContext()来获取解释器线程的CPU寄存器。将CONTEXT.Eip修改为函数的地址并调用SetThreadContext()。让该函数调用RaiseException()或抛出C ++异常。 ResumeThread()和繁荣。
答案 2 :(得分:0)
一个简短的回答 - 没有。
如果你的应用程序在Windows上运行,也许你可以从这个“调试器”发送消息并在主要消息循环中有一个消息循环?
答案 3 :(得分:0)
该解决方案的问题是,要做一个消息发送实现,我必须设置一个“监听器”作为脚本解释器的一部分。现在,解释器只执行该功能。消息循环在解释器之外实现。如果在函数内有一个无限循环,那么为了打破那个脚本,我必须在解释器中执行每条指令之间检查一条消息,即while(更多指令){check F10,执行脚本指令}。这似乎是许多额外的不必要的检查,可以减慢脚本执行速度。但如果这是唯一的解决方案,那么我想这就是必须的。我仍然认为必须有更好的方法。也许脚本解释器需要在子线程上运行,而主线程继续其消息循环,然后在获得F10时将终止脚本解释器线程。
答案 4 :(得分:0)
终止线程是不安全的,因为它可能使用整个过程共享的资源。
终止整个过程并不安全,但这对你没有帮助。
更安全的方法是让解释器定期检查事件,并将停止事件视为终止事件(或至少溢出到更高的循环)。
对于Windows,你也可以将APC排队到调用RaiseException(...)
或抛出异常的线程(虽然我会避免后者,因为它跨越API边界),但这也意味着线程将使自己陷入警觉状态。我并不是真的推荐它。
答案 5 :(得分:0)
无论是否明确编码,都需要检查消息循环中的“中断”变量。如果你通过一个简单的volatile int
来实现它,你将得到一个非常简单的测试和非常小的开销。