【发布时间】:2012-02-19 02:00:41
【问题描述】:
有没有办法挂钩到 dbx 用户会话的 WndProc?
背景: dbx DataSnap 使用 Indy 组件进行 TCP 通信。在最简单的形式中,DataSnap 服务器是一个接受连接的 Indy TCP 服务器。建立连接后,Indy 会为该连接创建一个线程来处理该连接的所有请求。
这些用户连接中的每一个都会消耗资源。对于具有几百个同时连接的服务器,这些资源可能很昂贵。许多资源可以被池化,但我不想总是在每次需要时都获取和释放资源。
相反,我想实现一个空闲计时器。在线程完成资源后,计时器将启动。如果线程在计时器结束之前访问资源,则资源仍将“分配”给该线程。但是,如果在下一次访问之前计时器已过,则资源将被释放回池中。下次线程需要该资源时,将从池中获取另一个资源。
我还没有找到方法来做到这一点。我试过使用 SetTimer 但我的计时器回调永远不会触发。我认为这是因为 Indy 的线程 WndProc 没有调度 WM_TIMER。我无法控制该线程的“执行循环”,因此我无法轻松检查是否已发出事件信号。事实上,除非线程正在处理用户请求,否则我的这个线程的代码都不会执行。事实上,我希望代码在任何用户请求之外执行。
我们将同样感谢原始问题的解决方案或替代方法的建议。
【问题讨论】:
-
Remy Lebeau 在其他地方指出 Indy 的线程没有消息循环。我之前曾尝试创建一个消息循环并在用户线程中实现我自己的 WndProc,但我的 WndProc 从未收到消息。 SetTimer 和传统的 TTimer 都不适用于我的消息循环。 (除了线程安全问题,这些问题已经得到解决。)我在许多其他应用程序的许多线程中创建了消息循环。但绝不会在 DataSnap 或 Indy TCP 服务器中。
-
我应该提到我正在使用 Delphi XE 和 DSTCP 传输。在另一个论坛中,Mat DeLong 建议使用 TDSSessionManager.Instance.AddSessionEvent。不幸的是,TDSSessionManager 不适用于 Delphi XE 中的 TCP 连接。 XE2 中修复了几个严重的问题。
-
我相信您在这里做任何实际事情的机会将需要 XE2,它具有一些新功能,可以减少您甚至不必担心像这个空闲计时器这样的低级黑客。
-
XE2 暂时不适合我们。我真的希望有人能提出可以在 XE 中完成的建议。我不是在寻找其他人来创建解决方案。除了我已经尝试过的以外,我只需要一些建议。我在思考这个问题时遇到了问题。
标签: delphi delphi-xe datasnap indy10