2011-12-29 37 views
5

Chào buổi tối. Tôi đang tìm phương pháp chia sẻ dữ liệu từ toàn bộ ứng dụng của mình, để các ứng dụng khác có thể đọc dữ liệu đó và sau đó thực hiện bất kỳ thứ gì họ muốn với nó (ví dụ: định dạng để hiển thị, sử dụng nó để ghi nhật ký, v.v.). Dữ liệu cần được cập nhật động trong chính phương thức đó.Chia sẻ hệ thống dữ liệu rộng

WMI đã lưu ý đầu tiên, nhưng sau đó bạn đã gặp phải sự cố ứng dụng tạm dừng trong khi đọc từ WMI. Ngoài ra, tôi đã không có ý tưởng thực sự làm thế nào để thiết lập không gian tên riêng của tôi hoặc các lớp học nếu đó là thậm chí có thể trong Delphi.

Sử dụng tệp là ý tưởng khác, nhưng điều đó có thể khiến đĩa nặng và đó là phương pháp thực sự khủng khiếp để sử dụng cho dữ liệu thời gian thực.

Sử dụng trình điều khiển có thể là lựa chọn tốt nhất, nhưng đó là một chút quá xâm nhập vào người dùng cuối theo ý thích của tôi và tôi không biết nên bắt đầu từ đâu.

WM_COPYDATA sẽ tuyệt vời, nhưng tôi không chắc liệu điều đó có đủ năng động hay không và liệu nó có nặng về tài nguyên hay không.

Sử dụng TCP/IP sẽ là lựa chọn tốt nhất cho mạng, nhưng rõ ràng là ít sử dụng khi chạy trên một hệ thống không có yêu cầu mạng.

Như bạn có thể thấy, tôi đang đấu tranh để tìm ra nơi để đi với điều này. Tôi không muốn đi vào một phương pháp chỉ để thấy rằng nó sẽ không làm việc ra cuối cùng. Về cơ bản, một cái gì đó giống như một dịch vụ, hoặc quá trình nền, để ghi lại dữ liệu và sau đó cho phép các ứng dụng khác đọc dữ liệu đó. Tôi chỉ không chắc chắn về phương pháp. Tôi không muốn độ cao/UAC để làm điều này, nhưng nếu cần thiết, tôi sẽ giải quyết cho nó.

Tôi đang chạy ở Delphi 2010 cho bài tập này.

Bất kỳ ý tưởng nào?

+0

Bạn có thể sử dụng cơ sở dữ liệu không? –

+0

Tôi nghĩ cần làm rõ thêm về "hệ thống rộng". Bạn có cần tương tác với các phiên khác (người dùng đăng nhập vào cùng một hệ thống thông qua "người dùng chuyển đổi", máy tính từ xa, Citrix, v.v.) hay chỉ là thông tin đăng nhập hiện tại? Hoặc hệ thống con VM? Tôi không nghĩ rằng WM_CopyData sẽ làm việc trên các ranh giới như vậy, vì vậy bạn nên làm rõ phạm vi. –

+0

Xin chào Chris. Tôi không cần phải tương tác với hoặc truyền đến các phiên khác hoặc máy ảo theo bất kỳ cách nào. Đó là truyền trong phiên mà tôi đang xem. –

Trả lời

5

Bạn muốn tạo ra một số kiến ​​trúc Client-Server, đó là cũng được gọi là IPC.

Sử dụng WM_COPYDATA là một ý tưởng rất hay. Tôi phát hiện ra nó rất nhanh, nhẹ và hiệu quả trên một máy cục bộ.Và nó có thể được phát sóng trên hệ thống, cho tất cả các ứng dụng cùng một lúc (được sử dụng cẩn thận nếu một số ứng dụng không xử lý nó một cách chính xác).

Bạn cũng có thể chia sẻ một số bộ nhớ, sử dụng các tệp được ánh xạ bộ nhớ. Đây có thể là tùy chọn IPC nhanh nhất xung quanh với số lượng lớn dữ liệu, nhưng việc đồng bộ hóa là một chút phức tạp (nếu bạn muốn chia sẻ nhiều hơn một bộ đệm cùng một lúc).

Ống có tên là ứng cử viên tốt cho địa phương. Chúng có xu hướng khó triển khai/cấu hình qua mạng, do các vấn đề bảo mật trên các phiên bản Windows hiện đại (và đang sử dụng giao thức TCP/IP cho truyền thông mạng - vì vậy bạn nên sử dụng trực tiếp TCP/IP thay thế).

Lời khuyên cá nhân của tôi là bạn sẽ triển khai chia sẻ dữ liệu của mình với các lớp trừu tượng, có thể cung cấp một số triển khai. Trước tiên, bạn có thể sử dụng WM_COPYDATA, sau đó chuyển sang các đường ống có tên, TCP/IP hoặc HTTP để truyền ứng dụng của bạn qua mạng.

Đối với ORM máy chủ nguồn mở ORM của chúng tôi, we implemented several protocols, bao gồm WM_COPY_DATA, có tên là đường ống, HTTP hoặc truy cập trực tiếp trong quá trình. Bạn có thể xem mã nguồn được cung cấp cho các mẫu triển khai. Dưới đây là một số tiêu chuẩn, cung cấp cho bạn dữ liệu từ việc triển khai thực:

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 

Như bạn thấy, nhanh nhất là truy cập trực tiếp, sau đó WM_COPY_DATA, sau đó đặt tên đường ống, sau đó HTTP (ví dụ: TCP/IP). Thông báo là khoảng 5 KB dữ liệu JSON chứa 113 hàng, được lấy ra từ máy chủ, sau đó được phân tích cú pháp trên máy khách 100 lần (có, khung công tác của chúng tôi là nhanh :)). Đối với các khối dữ liệu khổng lồ (như 4 MB), WM_COPY_DATA chậm hơn so với các đường ống được đặt tên hoặc HTTP-TCP/IP.

+0

Cảm ơn Arnaud. Nó chắc chắn trông giống như Local Windows Messages sẽ là phương pháp dễ nhất và hiệu quả nhất cho việc này. Dữ liệu tôi đang gửi sẽ chỉ có 3 giá trị 3 byte mỗi, và sau đó có khả năng 5 chuỗi tổng cộng ít hơn 100 byte và 8 chuỗi khác từ 1 đến 50 byte mỗi. Tổng số được gửi sẽ nhỏ hơn 1KB, nhưng một số giá trị sẽ được cập nhật rất thường xuyên (<250ms trong một số trường hợp). –

+0

@ Scott'Chron'Pritchard Bạn nói đúng, đây chính xác là loại dữ liệu mà một thông điệp GDI đang hanlding rất hiệu quả. Toàn bộ hệ thống giao diện người dùng Windows dựa trên hàng triệu thông điệp như vậy được xử lý nhanh nhất có thể. Đối với một giao tiếp địa phương, nó sẽ là giải pháp tốt nhất. –

2

Một số phương thức IPC (giao tiếp liên ngành) ở đâu trong Windows. Câu hỏi của bạn khá chung chung, tôi có thể đề xuất các tệp ánh xạ bộ nhớ để lưu trữ dữ liệu được chia sẻ của bạn và phát sóng thông báo qua PostMessage để thông báo cho ứng dụng khác rằng dữ liệu được chia sẻ đã thay đổi.

2

Nếu bạn không ngại chạy một quy trình khác, bạn có thể sử dụng một trong các cơ sở dữ liệu NoSQL.

Tôi khá chắc chắn rằng nhiều người trong số họ sẽ không có trình điều khiển Delphi, nhưng một số người trong số họ có trình điều khiển REST và do đó có thể được điều khiển từ khá nhiều thứ.

0

Googling cho 'delphi interprocess communication' sẽ cung cấp cho bạn nhiều con trỏ.

tôi đề nghị bạn hãy xem http://madshi.net/, đặc biệt là MadCodeHook (http://help.madshi.net/madCodeHook.htm)

Tôi có kinh nghiệm tốt với sản phẩm.

Các vấn đề liên quan