2011-12-29 2 views
5

안녕하세요. 다른 응용 프로그램이 해당 데이터를 읽고 원하는대로 (예 : 표시를 위해 포맷하고, 로깅 등에 사용) 할 수 있도록 시스템 전반의 응용 프로그램에서 데이터를 공유하는 방법을 찾고 있습니다. 메서드 자체에서 데이터를 동적으로 업데이트해야합니다.데이터 시스템 공유하기

WMI가 먼저 생각 나지 만 WMI에서 읽는 동안 응용 프로그램이 일시 중지되는 문제가 있습니다. 또한, 델파이에서도 가능하다면 내 자신의 네임 스페이스 또는 클래스를 설정하는 방법을 알지 못합니다.

파일 사용은 또 다른 아이디어이지만 디스크가 무거울 수 있으며 실시간 데이터를 사용하는 참된 방법입니다.

드라이버를 사용하는 것이 가장 좋은 방법 일 수 있지만, 사용자의 취향에 따라 사용자의 의도가 너무 복잡하기 때문에 어디서부터 시작해야할지 모릅니다.

WM_COPYDATA는 훌륭하지만, 충분히 동적인지, 리소스가 많든 적든간에 잘 모르겠습니다.

네트워크를 통해 TCP/IP를 사용하는 것이 가장 좋지만 네트워크 요구 사항이없는 단일 시스템에서 실행될 때는 거의 사용하지 않는 것이 좋습니다.

여러분도 알다시피, 나는 이것과 함께 어디로 가야할지 고심하고 있습니다. 나는 한 가지 방법으로 만 들어가서 결국에는 효과가 없을 것 같지 않다. 기본적으로 데이터를 기록한 다음 다른 응용 프로그램에서 해당 데이터를 읽을 수있게 해주는 서비스 또는 백그라운드 프로세스와 같은 것입니다. 나는 방법에 대해서 확신 할 수 없다. 나는 고도/UAC가 이것을 필요로하지 않는 것을 좋아할 것이다. 그러나 필요하면, 나는 그것을 해결할 것이다.

저는이 연습을 위해 Delphi 2010에서 실행 중입니다.

아이디어가 있으십니까?

+0

아마도 데이터베이스를 사용할 수 있습니까? –

+0

"시스템 전체에"더 많은 설명이 필요하다고 생각합니다. "전환 사용자", 원격 데스크톱, Citrix 등을 통해 동일한 시스템에 로그인 한 다른 세션 또는 현재 로그인과 상호 작용해야합니까? 또는 VM 하위 시스템? 나는 WM_CopyData가 그러한 경계를 넘어서서 작동하지 않을 것이라고 생각하므로 범위를 분명히해야합니다. –

+0

Chris 님, 안녕하세요. 어떤 방식 으로든 다른 세션이나 가상 시스템과 상호 작용하거나 전송할 필요가 없습니다. 내가보고있는 세션을 전송 중입니다. –

답변

5

당신은 일부 클라이언트 - 서버 아키텍처를 만들려면 IPC라고도합니다.

WM_COPYDATA을 사용하는 것이 좋습니다. 로컬 시스템에서 매우 빠르고 가볍고 효율적이라는 것을 알았습니다.또한 시스템을 통해 모든 응용 프로그램에 동시에 브로드 캐스트 될 수 있습니다 (일부 응용 프로그램이 올바르게 처리하지 못하는 경우주의해서 사용해야 함).

메모리 매핑 파일을 사용하여 일부 메모리를 공유 할 수도 있습니다. 방대한 양의 데이터를 처리 할 때 가장 빠른 IPC 옵션이 될 수 있지만, 동기화는 약간 복잡합니다 (한 번에 둘 이상의 버퍼를 공유하려는 경우).

명명 된 파이프는 지역에 적합한 후보입니다. 최신 Windows 버전의 보안 문제로 인해 네트워크를 통해 구현/구성하기가 어려우므로 (네트워크 통신을 위해 TCP/IP를 사용하므로 직접 TCP/IP를 사용하는 것이 좋습니다).

내 개인적인 조언은 당신이 여러 클래스를 구현할 수있는 추상 클래스로 데이터 공유를 구현해야한다는 것입니다. 먼저 WM_COPYDATA을 사용하고 네트워크를 통해 응용 프로그램을 전파하기 위해 명명 된 파이프, TCP/IP 또는 HTTP로 전환 할 수 있습니다.

WM_COPY_DATA, 명명 된 파이프, HTTP 또는 직접 처리 액세스를 포함하여 we implemented several protocols의 오픈 소스 클라이언트 - 서버 ORM에 대해 구현 패턴을 위해 제공된 소스 코드를 살펴볼 수 있습니다. 여기에 몇 가지 벤치 마크는 실제 구현에서 당신에게 데이터를 제공 할 수 있습니다

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)입니다. 메시지는 113 행을 포함하는 약 5KB의 JSON 데이터를 서버에서 검색 한 다음 클라이언트에서 100 번 구문 분석했습니다 (예, 우리 프레임 워크는 빠름 :)). 거대한 데이터 블록 (예 : 4MB)의 경우 WM_COPY_DATA은 명명 된 파이프 또는 HTTP-TCP/IP보다 느립니다.

+0

Arnaud에 감사드립니다. 분명히 로컬 Windows 메시지는 이와 같이 가장 쉽고 효율적인 방법 일 것입니다. 내가 보내는 데이터는 각각 3 바이트의 값을 3 개만 가질 수 있으며, 잠재적으로 5 개의 문자열은 100 바이트 미만이며, 또 다른 8 개의 문자열은 각각 1에서 50 바이트 사이입니다. 총 전송량은 1KB 미만이지만 일부 값은 매우 자주 업데이트됩니다 (일부 경우 250ms 미만). –

+0

@ Scott'Chron'Pritchard 네 말이 맞아, 이건 정확히 GDI 메시지가 매우 효율적으로 다루는 데이터 종류 야. 전체 Windows UI 시스템은 가능한 한 빨리 처리되는 수백만 개의 이러한 메시지에 의존합니다. 지역 커뮤니케이션의 경우 최상의 솔루션이 될 것입니다. –

2

Windows의 여러 IPC (프로세스 간 통신) 방법은 어디입니까? 귀하의 질문은 다소 일반적인, 나는 공유 데이터가 변경된 다른 응용 프로그램에 알리기 위해 PostMessage을 통해 공유 데이터 및 메시지 방송을 저장하기 위해 메모리 매핑 파일을 제안 할 수 있습니다.

2

다른 프로세스를 실행해도 괜찮 으면 NoSQL 데이터베이스 중 하나를 사용할 수 있습니다.

저는 델파이 드라이버가 없어도 REST 드라이버가 있기 때문에 꽤 많은 것들을 처리 할 수 ​​있다고 확신합니다.

0

'델파이 프로세스 간 통신'으로 인터넷 검색하면 많은 도움이됩니다.

난 당신이 내가 제품과 함께 좋은 경험을 가지고

(http://help.madshi.net/madCodeHook.htm), http://madshi.net/에서 특히 MadCodeHook을 살펴 보시기 바랍니다.