2009-03-22 25 views
12

Tôi đang tìm một khung công tác Threading để sử dụng trong ứng dụng Delphi của mình.Delphi - Khung làm việc luồng

Hiện tại tôi đang đánh giá ‘OmniThreadLibrary’ - cho đến nay có vẻ tốt và làm mọi thứ tôi cần.

Có bất kỳ 'khung luồng khác' cho Delphi không?

(Tôi đang sử dụng D2006 & D2009)

+0

Tôi nghĩ bạn nên thêm OmniThreadLibrary làm một câu trả lời cho câu hỏi của bạn. Sau đó, chúng ta có thể bỏ phiếu để so sánh nó với các tùy chọn khác. – Vegar

+0

Hãy cảnh giác với các chuyển đổi tự động của các loại chuỗi. - Đến và từ widestrings nói riêng. Cũng cần lưu ý rằng nhiều hàm chuẩn không phải là luồng an toàn. (Ví dụ, Định dạng). – Arafangion

+0

Làm thế nào là về khung luồng? – jpfollenius

Trả lời

7

Không phải là một khuôn khổ như vậy, nhưng có AsyncCalls. Phạm vi của nó là khác nhau từ OmniThreadLibrary, nhưng nó hỗ trợ các phiên bản cũ của Delphi là tốt.

4

Internet trực tiếp (Indy) chứa IdThread và sợi các kiểu dữ liệu an toàn trong IdThreadSafe.pas:

* TIdThreadSafeInteger 
* TIdThreadSafeBoolean 
* TIdThreadSafeString 
* TIdThreadSafeStringList 

... và một số chi tiết

Thư viện Mã Jedi (JCL) cũng bao gồm các lớp học và đồng bộ hóa chức năng (khoảng mười lớp)

+0

Cả hai đều có ít nhất một mức trừu tượng thấp hơn. Không phải những gì tôi gọi là Threading Frameworks. – mghie

+1

Tôi không biết về các loại dữ liệu an toàn của chủ đề Indy. Rất tuyệt! – Mick

14

Theo Vegar Đề xuất

Dựa trên vài giờ tôi đánh giá Omni ThreadLibrary

Dưới đây là một số trong những điều tôi thích về nó

1) Nó là đơn giản để sử dụng

2) Nó ẩn hầu hết các chi tiết về đa luồng

3) Với vài dòng mã bạn có thể thiết lập nhiều chủ đề

4) Nó rất dễ dàng để làm thông điệp quá trình liên

5) Nó vẫn đang được tích cực phát triển

+1

+1. Kết nối với điểm thứ hai của bạn là IMO rằng nó tập trung vào các đơn vị công việc thực thi (nhiệm vụ) thay vì các luồng. Chủ đề (hoặc hồ bơi luồng) chỉ là phương tiện để hoàn thành công việc. Đó là những gì làm cho một khuôn khổ thực sự, không phải là một mặt tiền đơn giản cho VCL luồng. – mghie

+5

Ở phía bên trái, nó có tài liệu tệ hại. Nhưng tôi sẽ khắc phục điều đó - tôi hứa. Tôi sẽ tôi sẽ làm thế! – gabr

+2

Vâng gbar là trung thực: tài liệu phải được cải thiện, upvote dù sao ... – Remko

2

Tôi đã phát triển khuôn khổ luồng rộng rãi của riêng mình, cũng được tích hợp với một khuôn khổ truyền thông được cấu trúc tương tự, trong 10 năm qua. Ở giai đoạn này nó có thể được sử dụng với Delphi 2005-2007, nhưng sẽ sớm có sẵn cho Delphi 2009-2010. Khung phát triển ứng dụng này có thể được sử dụng để xây dựng các hệ thống phân tán ồ ạt vì nó được thiết kế để cho phép bất kỳ luồng nào chạy trong bất kỳ quy trình nào và sử dụng một giao thức truyền thông chủ đề đơn giản giống như các luồng trong cùng một quy trình hoặc trong các quy trình khác nhau trên các máy khác nhau. Là một tính năng bổ sung, tôi có khung công tác này hiện đang chạy trong C#/Visual Studio để hệ thống phân tán được xây dựng bằng cách sử dụng khung này có thể kết hợp các ứng dụng Win32 và .NET, tất cả đều sử dụng cùng một phương pháp thiết kế. Bạn có thể tải xuống khung từ http://www.adug.org.au/downloads/CSIFramework.html

Thư viện được khung của tôi sử dụng không rộng rãi như thư viện phải xuất hiện từ trang web (tôi vừa mới viết lại trang đó, nhưng có thể mất một ngày để cập nhật). Hơn nữa, tất cả các tệp được yêu cầu (ngoài lớp trừu tượng cơ sở dữ liệu) được bao gồm trong khung làm việc, do đó không cần cài đặt thư viện của bên thứ ba nào để sử dụng khung công tác.

Ngoài Delphi, các thư viện được sử dụng là:

  • Indy (có trong Delphi, mặc dù tôi sử dụng phiên bản pre-unicode mới nhất)
  • JEDI JCL
  • TurboPower Abbrevia
  • một XML gọn gàng thư viện (tùy chọn)
  • thư viện trừu tượng cơ sở dữ liệu (tùy chọn)

Tôi đã sửa đổi một số đơn vị Delphi ngoại vi 1) để sửa lỗi rò rỉ bộ nhớ trong triển khai XML mở trong Delphi 2006 (sau đó được sửa trong các phiên bản Delphi sau), 2) để tích hợp ứng dụng dịch vụ với khung đăng nhập của tôi và 3) máy chủ SOAP độc lập với Indy 10 (không phải là Indy 9 như được bao gồm trong Delphi 2006).

Trong thực tế, khuôn khổ của tôi là nhiều, nhiều hơn chỉ là một khuôn khổ luồng, mặc dù khuôn khổ luồng là một phần của nó. Khung luồng được xây dựng bằng cách thực hiện tất cả các luồng như các hàng đợi luồng. Các "thông báo" được truyền giữa các hàng đợi luồng thực sự là dữ liệu được đóng gói trong một đối tượng được gõ chung, cho phép tôi chuyển hoàn toàn bất kỳ dữ liệu nào được cấu trúc theo bất kỳ cách nào giữa các luồng. Tôi có thể chuyển các tin nhắn giữa các chủ đề một cách không đồng bộ, bằng cách thêm một tin nhắn, hoặc đồng bộ, bằng cách thêm một tin nhắn và nhận được một tin nhắn trả lời. Các chủ đề tự đăng ký với các chủ đề khác để nhận tin nhắn, do đó, không có sự liên kết giữa các chủ đề tại thời điểm thiết kế.

Khung này đã được mở rộng để bao gồm các máy chủ và khách hàng truyền thông, và giao diện GUI chính, để có chính xác cùng một giao diện nhắn tin như hàng đợi luồng, do đó, gửi tin nhắn đến một quá trình từ xa hoặc chuyển nó vào GUI, sử dụng cú pháp giống như cú pháp được sử dụng giữa các chuỗi. Khung công tác đã được thiết kế theo cách mà không có yêu cầu phải biết gì về phát triển đa luồng để xây dựng một hệ thống phân tán được triển khai trên nhiều quy trình và nhiều luồng.

Có rất nhiều thứ khác trong khuôn khổ này và tôi đã nỗ lực hơn 2 năm để phát triển điều này trong 10 năm qua. Nó đã được triển khai thành công trong một hệ thống giám sát báo động nhiều tầng (sử dụng hơn 20 lớp khác nhau của luồng trên ba ứng dụng), và tôi hiện đang xây dựng một hệ thống phân tán trong Visual Studio 2008 bằng cách sử dụng khung công tác này.

Tóm lại, nếu tất cả những gì bạn muốn là một khuôn khổ luồng đơn giản, thì đây có lẽ là quá mức cần thiết. Tuy nhiên, nếu bạn muốn phát triển một hệ thống đa luồng phức tạp có thể mở rộng nhiều ứng dụng thì đường cong học tập có thể đáng giá.

PS Một vài điểm:

  • Chủ đề khởi động và tắt máy được tất cả các xử lý bởi các khuôn khổ (không cần phải viết bất kỳ mã để làm điều này)
  • Các chủ đề đó bao gồm các ứng dụng (số lượng và cấu hình) tất cả được định nghĩa trong một tệp cấu hình XML, không phải trong chính mã (không cần phải viết bất kỳ mã nào để bao gồm chúng trong ứng dụng)
  • Nếu bạn sử dụng thành phần trừu tượng cơ sở dữ liệu thì có thể truy cập cơ sở dữ liệu đa luồng. yêu cầu mã bổ sung)
  • Tôi hiện đang làm việc để thêm phân luồng, cho phép bất kỳ hàng đợi luồng nào có số chuỗi được chỉ định cụ thể (một lần nữa, không cần phải viết bất kỳ mã nào để thực hiện)
  • Có hướng dẫn của nhà phát triển đơn giản mà bạn có thể tải xuống từ trang web cũng được bao gồm trong phần tải xuống khung cung cấp cái nhìn tổng quan về khung từ quan điểm của nhà phát triển
  • Bản thân khung công tác đang được phát triển rất tích cực và với bản phát hành tiếp theo của Delphi tôi hy vọng sẽ có một phiên bản chạy trên Win32 (dưới Delphi), phiên bản .NET (C#/Visual Studio) và phiên bản Linux (sử dụng trình biên dịch đa nền tảng Deplhi mới)
Các vấn đề liên quan