2011-12-29 68 views
5

晚上好。 我正在寻找一种方法来共享我的应用程序在整个系统中的数据,以便其他应用程序可以读取该数据,然后做任何他们想要的数据(例如,将其格式化以显示,用于记录等)。数据需要在方法本身中动态更新。共享数据系统范围

首先让WMI浮想联翩,但是当你从WMI读取数据时,你会遇到应用程序暂停的问题。另外,如果在Delphi中甚至可能,我还没有真正想过如何设置我自己的命名空间或类。

使用文件是另一种想法,但这可能会让磁盘变得沉重,并且这是一种使用实时数据的非常糟糕的方法。

使用驱动程序可能是最好的选择,但这对用户来说有点太侵扰我的喜好,我不知道从哪里开始。

WM_COPYDATA会很棒,但我不确定这是否足够动态,以及它是否会占用资源。

使用TCP/IP将是通过网络的最佳选择,但显然在没有网络要求的单个系统上运行时几乎没有用处。

正如你所看到的,我正在努力弄清楚该怎么办。我不想只用一种方法来发现它最终不会实现。实质上,就像服务或后台进程一样,用于记录数据,然后允许其他应用程序读取该数据。我只是不确定的方法。我宁愿不需要提升/ UAC来做到这一点,但如果需要,我会解决它。

我在Delphi 2010中运行这个练习。

任何想法?

+0

你可以使用数据库吗? – 2011-12-29 07:13:50

+0

我认为需要对“全系统”做更多的说明。你是否需要与其他会话进行交互(用户通过“切换用户”,远程桌面,思杰等登录到同一个系统),还是仅仅是当前的登录?还是VM子系统?我不认为WM_CopyData会跨越这些界限,所以你应该澄清范围。 – 2011-12-29 15:35:56

+0

嗨克里斯。我不需要以任何方式与其他会话或虚拟机进行交互或传输。它正在传输中,我正在看。 – 2011-12-29 18:31:42

回答

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的包含113行的JSON数据,从服务器检索,然后在客户端解析100次(是的,我们的框架速度很快:))。对于大块数据(如4 MB),WM_COPY_DATA比命名管道或HTTP-TCP/IP要慢。

+0

感谢Arnaud。它确实看起来像本地Windows消息将是最简单和最有效的方法。我发送的数据将只有3个值,每个3个字节,然后可能有5个字符串总数少于100个字节,另外还有8个字符串,每个字符串在1到50个字节之间。发送的总数将小于1KB,但其中一些值将会非常频繁地更新(在某些情况下<250ms)。 – 2011-12-29 18:39:18

+0

@ Scott'Chron'Pritchard你是对的,这正是GDI消息非常高效地处理的数据。整个Windows UI系统都依赖于数百万个尽可能快的处理信息。对于本地通信而言,这将是最好的解决方案。 – 2011-12-30 10:16:15

2

Windows中的几种IPC(进程间通信)方法在哪里。你的问题相当笼统,我可以建议内存映射文件通过PostMessage存储共享数据和消息广播,以通知其他应用程序共享数据已更改。

2

如果您不介意运行另一个进程,则可以使用NoSQL数据库之一。

我敢肯定,他们中的很多人不会有德尔福的驱动程序,但其中一些人有REST驱动程序,因此可以从几乎任何东西驱动。

0

'delphi interprocess communication'的搜索会给你很多指针。

我建议你看一看http://madshi.net/,特别是MadCodeHook(http://help.madshi.net/madCodeHook.htm)

我的产品很好的经验。