晚上好。 我正在寻找一种方法来从我的系统应用程序共享数据,以便其他应用程序可以读取该数据,然后随意执行任何操作(例如,将其格式化以便显示,将其用于日志记录等)。数据需要在方法本身中动态更新。
首先想到了WMI,但是当你从WMI阅读时,你已经遇到了应用程序暂停的问题。另外,如果在Delphi中甚至可以设置我自己的命名空间或类,我也不知道如何设置。使用文件是另一个想法,但这可能会让磁盘变得很重,而且这对于实时数据来说是一种非常糟糕的方法。
使用驱动程序可能是最好的选择,但是根据我的喜好,这对用户端来说有点过于干扰,我不知道从哪里开始。
WM_COPYDATA会很棒,但我不确定它是否足够动态,是否会对资源造成重大影响。
使用TCP / IP是网络上的最佳选择,但在没有网络要求的单个系统上运行时显然没什么用。
正如你所看到的,我正在努力弄清楚要去哪里。我不想进入一种方法只是为了发现它最终不会成功。本质上,类似于服务或后台进程,用于记录数据,然后允许其他应用程序读取该数据。我只是不确定方法。我宁愿不需要提升/ UAC这样做,但如果需要,我会满足于此。
我正在使用Delphi 2010进行此练习。
有什么想法吗?
答案 0 :(得分:5)
您想要创建一些客户端 - 服务器架构,也称为IPC。
使用WM_COPYDATA
是一个非常好的主意。我发现它在本地机器上非常快速,轻便且高效。它可以在系统上广播,同时在所有应用程序上广播(如果某些应用程序无法正确处理它,请小心使用)。
您还可以使用内存映射文件共享一些内存。对于大量数据,这可能是最快的IPC选项,但同步有点复杂(如果您想一次共享多个缓冲区)。
命名管道是本地人的好选择。由于现代Windows版本的安全问题(并且使用TCP / IP进行网络通信 - 因此您最好直接使用TCP / IP),它们往往很难通过网络实现/配置。
我个人的建议是,您应该使用抽象类实现数据共享,能够提供多种实现。您可以先使用WM_COPYDATA
,然后切换到命名管道,TCP / IP或HTTP,以便通过网络传播您的应用程序。
对于我们的开源客户端 - 服务器ORM,we implemented several protocols,包括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
如您所见,最快的是直接访问,然后是WM_COPY_DATA
,然后是命名管道,然后是HTTP(即TCP / IP)。消息是大约5 KB的JSON数据,包含113行,从服务器检索,然后在客户端上解析100次(是的,我们的框架很快:))。对于大量数据块(如4 MB),WM_COPY_DATA
比命名管道或HTTP-TCP / IP慢。
答案 1 :(得分:2)
Windows中的几种IPC(进程间通信)方法在哪里。您的问题相当笼统,我可以通过PostMessage
建议内存映射文件来存储您的共享数据和消息广播,以通知其他应用程序共享数据已更改。
答案 2 :(得分:2)
如果您不介意运行其他进程,可以使用其中一个NoSQL数据库。
我很确定他们中的很多人都没有Delphi驱动程序,但是其中一些驱动程序有REST驱动程序,因此可以从几乎任何东西驱动。
答案 3 :(得分:1)
Memcached是在应用程序之间共享数据的简便方法。 Memcached是一个内存键值存储,用于存储任意数据(字符串,对象)的小块。
可以在谷歌代码上找到Memcached的Delphi 2010客户端:
http://code.google.com/p/delphimemcache/
相关问题:
答案 4 :(得分:0)
谷歌搜索'delphi进程间通信'会给你很多指示。
我建议你看看http://madshi.net/,尤其是MadCodeHook(http://help.madshi.net/madCodeHook.htm)
我对该产品有很好的经验。