2011-09-03 25 views
5

Tôi đang sử dụng PySide để quản lý một số phần cứng và thực hiện một số thao tác tương đối đơn giản tùy thuộc vào (ví dụ) các lần nhấp nút trong giao diện. Mã để chạy từng phần cứng này nằm trong một chuỗi khác. Để thuận tiện, để tất cả những trình điều khiển phần cứng Tôi đã thêm một invoke_method tín hiệu chung chung, như vậy mà một thành phần giao diện người dùng có thể sử dụngGọi phương thức an toàn và lười biếng trong PySide/PyQt

my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...}) 

Rõ ràng này truy cập vào thuộc tính tín hiệu ở chỗ chủ đề khác trực tiếp .... nhưng tôi m không chắc chắn nếu điều này là nhất thiết phải trong một thế giới GIL.

Nếu điều này thực sự là quá lười biếng một giải pháp - có bất kỳ lựa chọn thay thế tuyệt vời khác để gọi phương pháp tùy ý trong chủ đề tùy ý mà không cần phải có tín hiệu hoạt động cụ thể trong giao diện người dùng kết nối với tín hiệu khác trong trình điều khiển?

tôi có thể tưởng tượng thay vì sử dụng một tín hiệu trong mỗi bit mã UI rằng truy cập một mảnh khác nhau của phần cứng - một cái gì đó giống như do_invocation_driver_1do_invocation_driver_2 và kết nối những đến invoke_method tín hiệu của trình điều khiển tương ứng.

Trả lời

4

Tôi khuyên bạn nên đọc this post để có cách tiếp cận chung cho các luồng giao diện bằng GUI PyQt. Bài viết thảo luận về một thread mà không socket I/O, nhưng điều này thực sự được áp dụng cho bất kỳ chủ đề. Cụ thể, các giao diện phần cứng-giao diện thường cũng sử dụng I/O, do đó, điều này có thể phù hợp.

Cách tiếp cận được thảo luận rất chung chung, sử dụng Queue.Queue và có vẻ như quá mức cho các tác vụ đơn giản (nhưng tôi chỉ muốn gọi hàm "đó" trong một chuỗi). Tuy nhiên, một khi ứng dụng của bạn phát triển không tầm thường, bạn sẽ đánh giá cao nó, bởi vì nó tránh bất kỳ vấn đề đồng bộ hóa thread nào, và rất khả năng mở rộng. Cá nhân tôi đã sử dụng nó để triển khai các GUI PyQt phức tạp với các chủ đề phụ làm tất cả các loại công cụ.

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