【问题标题】:concurrency between OS processes [duplicate]操作系统进程之间的并发[重复]
【发布时间】:2013-08-31 18:08:16
【问题描述】:

问题过于复杂。一个非常直接的解决方案是按照 Uwe 和 David 的建议重新设计:

(1) 工作应用程序。 (2) 长时间运行的 TcpServer,等待客户端并调用 worker (3) 客户。

==========================

我想建立一个SampleApp,它的功能是:

  • 启动时会检查是否已经有SampleApp在运行;
  • 如果没有,它会启动一个TcpServer,一个TcpClient,将某个命令从它的TcpClient 传递给它的TcpServer,完成工作,关闭TcpServer,然后退出;
  • 如果是,它启动一个TcpClient,将命令传递给另一个TcpServer,然后退出。 (其他人的TcpServer 将完成这项工作。)
  • 可能有多个SampleApp 在第一个仍在运行时启动。

我不知道如何实际解决这个问题,例如:

  1. 从哪个架构开始? (著名的 OmniThreadLibrary 似乎处理基于线程的并发,而不是基于操作系统进程的并发。)
  2. 没有SampleApp 正在运行。两个SampleApp (几乎)同时启动。如何保证只启动一个 TcpServer? (没有“全局列表”来注册传入的“玩家”。)
  3. 有一个SampleApp 正在运行。如果 2nd 检测到 1st 的 mutex 并因此决定成为 TcpClient,但 1st 停止其 TcpServer 并退出,如何处理?

感谢任何见解!

【问题讨论】:

  • 该线程似乎无法解决我的问题。比如,2nd检测到1st的mutex,决定做TcpClient,1st停止了自己的TcpServer,退出了怎么办?
  • 我在您的问题中没有看到这种情况。
  • 您将总是在启动/关闭时有一点开销时间,因此永远无法防止一个人看不到另一个人的可能性,只能尽量减少。
  • 为什么不在Windows启动时将tcpserver作为服务启动并让它永远运行?

标签: delphi concurrency


【解决方案1】:

如果您想主要使用它在单台计算机上的进程之间进行通信(在单个用户会话中),您应该喜欢 ActiveX 自动化对象。创建一个使用 LocalServer 的 COM 对象将为您启动和停止“服务器”进程。

在此处查看更多信息:http://docwiki.embarcadero.com/RADStudio/XE4/en/Creating_an_Active_Server_Object

如果你坚持使用 TTcpServer,当两个进程(几乎)同时启动时,仍然只允许一个绑定到某个 TCP 端口,而另一个在 TTcpServer 上调用 Listen 时会出现异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2012-12-17
    • 2018-06-23
    相关资源
    最近更新 更多