Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跨线程异常抛出 我有一个应用程序,允许用户用自己的语言编写自己的代码,这有点像C++。然而,我们遇到了一些问题,有时我们的用户会意外地在脚本中写入一个无限循环。一旦脚本进入无限循环,它们可以退出的唯一方法就是关闭应用程序并重新启动,这可能会丢失它们的工作。我想添加一些方法,当用户意识到他的代码在一个无限循环中时,可以点击一个特殊的键,比如F10或其他什么,代码就会跳出循环。但是我不想在脚本运行时实现大量的检查。最理想的情况是,我希望有一个单独的“调试器”线程,它大部分是空闲的,但作为它的任务之一,它会侦听F10键,当它得到F10键时,它会导致脚本运行时线程抛出异常,从而停止执行脚本。所以我的问题是,有没有办法让一个线程导致另一个线程抛出异常?我的应用程序是用C++编写的。< /P> < P>简短的答案-不。_C++_Winapi - Fatal编程技术网

跨线程异常抛出 我有一个应用程序,允许用户用自己的语言编写自己的代码,这有点像C++。然而,我们遇到了一些问题,有时我们的用户会意外地在脚本中写入一个无限循环。一旦脚本进入无限循环,它们可以退出的唯一方法就是关闭应用程序并重新启动,这可能会丢失它们的工作。我想添加一些方法,当用户意识到他的代码在一个无限循环中时,可以点击一个特殊的键,比如F10或其他什么,代码就会跳出循环。但是我不想在脚本运行时实现大量的检查。最理想的情况是,我希望有一个单独的“调试器”线程,它大部分是空闲的,但作为它的任务之一,它会侦听F10键,当它得到F10键时,它会导致脚本运行时线程抛出异常,从而停止执行脚本。所以我的问题是,有没有办法让一个线程导致另一个线程抛出异常?我的应用程序是用C++编写的。< /P> < P>简短的答案-不。

跨线程异常抛出 我有一个应用程序,允许用户用自己的语言编写自己的代码,这有点像C++。然而,我们遇到了一些问题,有时我们的用户会意外地在脚本中写入一个无限循环。一旦脚本进入无限循环,它们可以退出的唯一方法就是关闭应用程序并重新启动,这可能会丢失它们的工作。我想添加一些方法,当用户意识到他的代码在一个无限循环中时,可以点击一个特殊的键,比如F10或其他什么,代码就会跳出循环。但是我不想在脚本运行时实现大量的检查。最理想的情况是,我希望有一个单独的“调试器”线程,它大部分是空闲的,但作为它的任务之一,它会侦听F10键,当它得到F10键时,它会导致脚本运行时线程抛出异常,从而停止执行脚本。所以我的问题是,有没有办法让一个线程导致另一个线程抛出异常?我的应用程序是用C++编写的。< /P> < P>简短的答案-不。,c++,winapi,C++,Winapi,如果您的应用程序在Windows上运行,也许您可以从此“调试器”面板发送消息,并在主面板中有一个消息循环?简短回答-否 如果您的应用程序在Windows上运行,也许您可以从此“调试器”发送消息踩踏并在主循环中有一个消息循环?如果应用程序实际解释了脚本,则只要在发生某个用户事件时告诉解释器停止执行即可。如果应用程序实际解释了脚本,则只要在发生某个用户事件时告诉解释器停止执行即可发生。该解决方案的问题是,要执行消息发送实现,我必须设置一个“侦听器”作为脚本解释器的一部分。现在,解释器只是执行函数。消

如果您的应用程序在Windows上运行,也许您可以从此“调试器”面板发送消息,并在主面板中有一个消息循环?

简短回答-否


如果您的应用程序在Windows上运行,也许您可以从此“调试器”发送消息踩踏并在主循环中有一个消息循环?

如果应用程序实际解释了脚本,则只要在发生某个用户事件时告诉解释器停止执行即可。

如果应用程序实际解释了脚本,则只要在发生某个用户事件时告诉解释器停止执行即可发生。

该解决方案的问题是,要执行消息发送实现,我必须设置一个“侦听器”作为脚本解释器的一部分。现在,解释器只是执行函数。消息循环在解释器外部实现。如果函数中有一个无限循环,那么为了跳出该脚本,我必须在解释器中执行每个指令之间检查消息,即当(更多指令){check F10,execute script instruction}。这似乎有很多额外的不必要的检查,可能会减慢脚本的执行速度。但如果这是唯一的解决办法,那么我想这就是它必须的。我仍然认为应该有更好的办法。可能脚本解释器需要在子线程上运行,而主线程继续其消息循环,然后在收到F10时终止脚本解释器线程。

该解决方案的问题是,要执行消息发送实现,我必须设置一个“侦听器”作为脚本解释器的一部分。现在,解释器只是执行函数。消息循环在解释器外部实现。如果函数中有一个无限循环,那么为了跳出该脚本,我必须在解释器中执行每个指令之间检查消息,即当(更多指令){check F10,execute script instruction}。这似乎有很多额外的不必要的检查,可能会减慢脚本的执行速度。但如果这是唯一的解决办法,那么我想这就是它必须的。我仍然认为应该有更好的办法。可能脚本解释器需要在子线程上运行,而主线程继续其消息循环,然后在收到F10时终止脚本解释器线程。

终止线程是不安全的,因为它可能正在使用整个进程中共享的资源

终止整个流程不太安全,但这对您没有帮助

更安全的处理方法是让解释器定期检查事件,并将停止事件视为终止事件(或至少溢出到更高的循环)


对于windows,您还可以将APC排队到调用
RaiseException(…)
或引发异常的线程(尽管我会避免后者,因为后者跨越了API边界),但这也意味着线程将自身置于可警报状态。我并不推荐这样做。

终止一个线程是不安全的,因为它可能正在使用整个进程中共享的资源

终止整个流程不太安全,但这对您没有帮助

更安全的处理方法是让解释器定期检查事件,并将停止事件视为终止事件(或至少溢出到更高的循环)


对于windows,您还可以将APC排队到调用
RaiseException(…)
或引发异常的线程(尽管我会避免后者,因为后者跨越了API边界),但这也意味着线程将自身置于可警报状态。我并不真的推荐它。

这是可能的。例如,在单独的线程、隐藏窗口和WM_热键中检测击键。调用SuspendThread()冻结解释器线程。现在使用GetThreadContext()获取解释器线程的CPU寄存器。将CONTEXT.Eip修改为函数的地址并调用SetThreadContext()。函数调用RAISE异常(),或者抛出C++异常。恢复线程()和动臂。

这是可能的。例如,在单独的线程、隐藏窗口和WM_热键中检测击键。调用SuspendThread()冻结解释器线程。现在使用GetThreadContext()获取解释器线程的CPU寄存器。将CONTEXT.Eip修改为函数的地址并调用SetThreadContext()。函数调用RAISE异常(),或者抛出C++异常。ResumeThread()和boom.

无论是否显式编码,都需要检查消息循环中的“中断”变量。如果您通过一个简单的
volatile int
来实现这一点,您将同时拥有一个v