如何优雅地使用c ++ / c#/ vc ++终止另一个应用程序?

时间:2018-04-22 14:32:11

标签: c# c++ windows visual-c++ process

我有一个运行无限循环的应用程序,并在该循环中执行一些重要的功能。我需要为用户提供另一个应用程序,它将以无限循环终止应用程序。问题是如果用户在内部循环执行某些操作时终止应用程序。这会导致国家不一致。我尝试了kill()和TerminateProcess,但他们没有帮助。有没有什么方法可以通过无限循环发出应用信号来完成迭代并退出?我对c#,cpp和vc ++中的解决方案持开放态度。

编辑:

可以访问循环程序的源代码。

2 个答案:

答案 0 :(得分:1)

  

运行无限循环并执行一些重要功能的应用程序

只要它具有“重要功能”,所讨论的程序就有办法从某处(例如,从文件或从网络套接字)获取新的输入数据。因此,您可以将特殊标记添加到输入数据中,其含义为“操作结束”。收到此类令牌后,程序将知道是时候自行关闭了。这种性质最简单的标记之一是常规文件或远程侧插槽关闭的文件结尾。

我刚刚描述的方法很简单,可称为“带内控制信道”。也就是说,您使用单个通道来处理要处理的数据和要控制的命令(即使只有一个命令,“停止”)。

另一种选择是“带外控制通道”,即在应用程序之间传递命令的第二个通道。

  

问题是如果用户在内部循环执行某些操作时终止应用程序。这会导致国家不一致。

您尝试使用kill是使用称为进程间signals的工具的一种可能性。要正确使用它,接收程序必须注册信号处理程序例程以自行启动关闭。发件人应使用匹配的信号编号。使用kill(POSIX中的SIGKILL)不是最佳选择,因为它具有特殊行为,无法使用自定义信号处理程序进行分配。在POSIX中,最好使用SIGUSR1或许多其他信号之一。我不记得原生的Windows等价物。

在传统操作系统中,有许多机制可以组织进程之间的处理器间通信,请参阅Wikipedia到完整列表,了解从共享文件到命名管道和网络套接字的所有内容。选择最符合您需求的产品。您只需传递一位数据,因此基本上最容易编程的数据是最好的。

答案 1 :(得分:1)

虽然进程间通信有很多变化,但为此目的,一个简单的事件就足够了。

在您需要控制的过程中:

  • WaitForSingleObject(hEvent, ZERO_TIMEOUT)(带名字,使其足够独特)
  • 定期使用hEvent = OpenEvent()
  • 进行检查

从进行控制的过程:

  • SetEvent(hEvent)传递相同名称
  • WaitForSingleObject会导致其他流程中class User < ApplicationRecord include Clearance::User has_many :challenges has_many :puns end class Challenge < ApplicationRecord has_many :puns, :dependent => :delete_all belongs_to :user end class Pun < ApplicationRecord belongs_to :challenge belongs_to :user end 的返回值发生变化。

一种稍微好一点的方法可能是在主应用程序中启动一个后台线程,它创建一个窗口和一个任务栏图标,其菜单上有一个Exit选项。然后,您只需要在线程之间共享事件,而不是在进程之间共享事件,这将删除对唯一名称的要求。