2012-07-25 34 views
10

Tôi cần một số lời khuyên trong mã hóa thích hợp:Mã hóa tốt? (Nhiều Vòng Tin Nhắn)

Tôi đang làm việc trên một chương trình có nhiều kết nối nối tiếp được sử dụng. Mỗi đường truyền thông có một bộ điều khiển làm việc như một lớp trừu tượng. Giữa bộ điều khiển và cổng nối tiếp, một giao thức được chèn vào để bọc dữ liệu trong các gói, sẵn sàng để chuyển. Giao thức sẽ xử lý các giao hàng không thành công, gửi lại, vv Để đảm bảo GUI không treo, mỗi đường kết nối (giao thức và cổng nối tiếp) được tạo trên một luồng riêng biệt. Bộ điều khiển được xử lý bởi luồng chính, vì nó có các nút điều khiển trong GUI.

Hiện tại, khi tạo chủ đề, tôi đã chọn tạo vòng lặp thông báo trên chúng (Application.Run()), vì vậy thay vì bỏ phiếu đệm và sinh nếu không có công việc, tôi chỉ cần gọi luồng (BeginInvoke) và sử dụng vòng lặp tin nhắn như một bộ đệm. Điều này hiện đang hoạt động độc đáo, và không có vấn đề nghiêm trọng cho đến nay.

Câu hỏi của tôi bây giờ là: Đây có phải là "mã hóa tốt" hay tôi nên sử dụng vòng lặp while trên tread và là bộ đệm bỏ phiếu thay thế ?, hoặc một số thứ ba?

Tôi muốn hiển thị mã, nhưng cho đến nay nó là hàng nghìn dòng mã, vì vậy hãy cụ thể nếu bạn cần xem bất kỳ phần nào của mã. :)

Cảm ơn bạn.

Trả lời

4

Sử dụng vòng lặp tin nhắn trong mỗi chuỗi là hoàn toàn tốt; Windows được tối ưu hóa cho kịch bản này. Bạn có quyền tránh bỏ phiếu, nhưng bạn có thể muốn xem xét các thiết kế dựa trên sự kiện khác vẫn hiệu quả hơn, ví dụ như chuẩn bị gói để chuyển và gọi SetEvent để thông báo cho chủ đề đã sẵn sàng hoặc xếp hàng an toàn và chuỗi an toàn Martin James gợi ý.

+0

Không thực sự, không. WM_COPYDATA là tốt cho giao tiếp giữa các quá trình. Thật vô nghĩa khi sử dụng nó cho các giao tiếp giữa các luồng trong một quá trình. Nó dễ dàng hơn/đơn giản hơn để chỉ cần vượt qua bộ đệm/blob/bất kỳ đối tượng nào bằng con trỏ, ví dụ. bằng cách truyền * Bộ đệm vào tin nhắn.lParam, PostMessage() ing và truyền lại ở đầu kia. –

+0

Hàng đợi tin nhắn Windows được tối ưu hóa để giao tiếp với các chủ đề GUI. Không phải là tối ưu để giao tiếp từ các luồng GUI đến các luồng công việc không phải GUI. Ngay cả một hàng đợi tiêu dùng sản xuất tiêu dùng, không được tối ưu hóa dựa trên semaphore đơn giản nhanh gấp bốn lần so với WMQ. Trong hầu hết các ứng dụng, hiệu năng xếp hàng P-C thường không phải là vấn đề. –

+0

Tôi đồng ý về cả hai điểm thực sự. Tôi sẽ chỉnh sửa WM_COPYDATA; Tôi không suy nghĩ rõ ràng. Về hàng đợi tin nhắn, đó là giải pháp dựa trên sự kiện tổng quát. Tùy thuộc vào yêu cầu của ứng dụng, các mô hình khác có thể tốt hơn. – tenfour

1

Tôi không chắc chắn 100% những gì bạn đang làm gì ở đây, nhưng với một chút 'điền vào' nó không âm thanh xấu :)

Khi ứng dụng của bạn là nhàn rỗi, (không comms), là CPU sử dụng 0%?

Ứng dụng của bạn không có giấc ngủ (0)/ngủ (1) hoặc các vòng bỏ phiếu tương tự?

Sản phẩm có hoạt động với độ trễ thấp hợp lý không?

Nếu câu trả lời là ba 'YES', bạn cần sử dụng tốt :)

Có một vài, (rất ít), trường hợp bỏ phiếu cho kết quả vv là một ý tưởng tốt, (ví dụ. Khi tần số của các sự kiện trong các chủ đề quá cao đến mức báo hiệu mọi sự kiện tiến trình vào GUI sẽ làm cho nó quá tải), nhưng chủ yếu, nó chỉ là thiết kế kém.

+0

Mục đích của chương trình này là kiểm soát các hộp 1-4 (cho đến nay), mỗi hộp chứa Arduino. Mỗi Arduino được kết nối với I/O kỹ thuật số của một hệ thống giả lập. Hệ thống mô phỏng song song cần một hộp pr. giả lập. Các mô phỏng là một phần của R & D trong công ty nơi tôi làm việc. Chương trình Windows có khả năng lập trình lại sơ đồ chân vịt Arduino trong thời gian chạy, cùng với việc đọc/ghi trạng thái cao/thấp của các chân. – Anders

+0

Triple YES từ đây .. Tôi đã cố gắng thay đổi mã thành bộ đệm, với thread.yields nếu không có dữ liệu và điều đó khiến chương trình thiếu một chút, vì vậy tôi đoán tôi ổn với các vòng tin nhắn :) – Anders

+0

Vâng, Tôi cũng có thể đã sử dụng hàng đợi hơi khác nhau, nhưng nếu ứng dụng của bạn đủ hiệu quả, phản hồi nhanh và không sụp đổ, ai quan tâm :)) –

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