2011-12-29 56 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)

我的產品很好的經驗。