delphi - Indy 是否在 XP 上使用某种协作式多任务处理,如果是,有没有办法切换到其他连接?

标签 delphi indy

我有一个使用 Indy 的 TIdTCPServer 组件运行的 Web 服务器。我有几个请求需要同步,以便在发送前一个请求后处理每个请求。这是使用互斥锁完成的。在 Vista 和 Win7 上,这很好用,但在 XP 上,互斥锁上的等待似乎也会挂起其他连接。它在 5 秒后超时,所以它仍然会继续,但我的应用程序对时间非常敏感。

我假设它在 XP 上是这样的:

连接1:

  • 解析请求
  • 尝试获取互斥锁
  • 成功
  • 做事
  • 回复 -> Indy 借此机会切换话题

  • 连接2:
  • 解析请求
  • 尝试获取互斥锁
  • 超时失败
  • 返回“对不起,超时”-> Indy 切换回连接 1

  • 连接1:
  • 释放互斥锁

  • 如果 Indy 使用这样的协作式多任务处理,我将不得不做其他事情。有谁知道在 XP 上它是否使用协作多任务处理?

    编辑:

    所以,我在 IdYarn 中看到 yarn 现在是一个完全空的对象。尽管如此,问题仍然在于合作多任务处理。

    最佳答案

    TIdTCPServer 中的每个连接都在其自己的工作线程中运行。操作系统而不是 Indy 控制线程之间的任务切换。如果一个线程成功锁定了互斥锁,那么在第一个线程解锁之前,其他线程都不能进入锁。那就是在任何操作系统版本上的多线程编程 101。这种行为并不是 Indy 特有的。您概述的是它应该如何表现。如果 Vista/Win7 的行为不是这样,那么您就有问题了。

    关于delphi - Indy 是否在 XP 上使用某种协作式多任务处理,如果是,有没有办法切换到其他连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8351528/

    相关文章:

    visual-studio - Delphi 等同于 Visual Studio 编码的 UI 测试?

    delphi - Delphi 2010 的编译器版本是什么?

    delphi - 为什么当我调用 UnixToDateTime 时会得到数千年后的结果?

    delphi - Indy 10 + XE8 长文件名分段上传

    delphi - 使用条款的差异

    delphi - 如何为我的组件创建文件夹(目录)属性编辑器?

    delphi - TIdFtpClient - 在服务器端处理特定错误

    delphi - 印地上传速度

    delphi - Indy header 上次修改 - 日期编码参数无效

    delphi - TCP服务器和Error1400