Sco*_*ard 5 delphi delphi-2010
晚上好.我正在寻找一种方法来从我的应用程序系统中共享数据,以便其他应用程序可以读取该数据然后随意执行任何操作(例如,将其格式化以用于显示,将其用于日志记录等).数据需要在方法本身中动态更新.
WMI首先浮现在脑海中,但是当你从WMI阅读时,你会遇到应用程序暂停的问题.另外,如果在Delphi中甚至可以实现,我也不知道如何设置我自己的命名空间或类.
使用文件是另一个想法,但这可能会让磁盘变得很重,而且这对于实时数据来说是一种非常糟糕的方法.
使用驱动程序可能是最好的选择,但是根据我的喜好,这对用户端来说有点过于干扰,而且我不知道从哪里开始使用它.
WM_COPYDATA会很棒,但我不确定它是否足够动态,以及它是否会对资源造成沉重负担.
使用TCP/IP将是通过网络的最佳选择,但在没有网络要求的单个系统上运行时显然没什么用处.
正如你所看到的,我正在努力弄清楚要去哪里.我不想进入一种方法只是为了发现它最终不会成功.本质上,类似于服务或后台进程,用于记录数据,然后允许其他应用程序读取该数据.我只是不确定方法.我宁愿不需要提升/ UAC这样做,但如果需要,我会满足于此.
我正在使用Delphi 2010进行此练习.
有任何想法吗?
您想要创建一些客户端 - 服务器体系结构,也称为IPC.
使用WM_COPYDATA是一个非常好的主意.我发现它在本地机器上非常快速,轻便且高效.它可以在系统上广播,同时对所有应用程序进行广播(如果某些应用程序无法正确处理,则要小心使用).
您还可以使用内存映射文件共享一些内存.对于大量数据,这可能是最快的IPC选项,但同步有点复杂(如果您想一次共享多个缓冲区).
命名管道是当地的好选择.由于现代Windows版本的安全问题(并且使用TCP/IP进行网络通信 - 因此您最好直接使用TCP/IP),它们往往很难通过网络实现/配置.
我个人的建议是,您应该使用抽象类实现数据共享,能够提供多种实现.您可以WM_COPYDATA先使用,然后切换到命名管道,TCP/IP或HTTP,以便通过网络传播您的应用程序.
对于我们的开源客户端 - 服务器ORM,我们实现了多种协议,包括WM_COPY_DATA命名管道,HTTP或直接进程内访问.您可以查看为实现模式提供的源代码.以下是一些基准测试,为您提供实际实现的数据:
Client server access:
- Http client keep alive: 3001 assertions passed
first in 7.87ms, done in 153.37ms i.e. 6520/s, average 153us
- Http client multi connect: 3001 assertions passed
first in 151us, done in 305.98ms i.e. 3268/s, average 305us
- Named pipe access: 3003 assertions passed
first in 78.67ms, done in 187.15ms i.e. 5343/s, average 187us
- Local window messages: 3002 assertions passed
first in 148us, done in 112.90ms i.e. 8857/s, average 112us
- Direct in process access: 3001 assertions passed
first in 44us, done in 41.69ms i.e. 23981/s, average 41us
Total failed: 0 / 15014 - Client server access PASSED
Run Code Online (Sandbox Code Playgroud)
如您所见,最快的是直接访问,然后是WM_COPY_DATA命名管道,然后是HTTP(即TCP/IP).消息是大约5 KB的JSON数据,包含113行,从服务器检索,然后在客户端上解析100次(是的,我们的框架很快:)).对于大量数据块(如4 MB),WM_COPY_DATA比命名管道或HTTP-TCP/IP慢.
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |