2015-01-14 19 views
5

tôi đã thực hiện sự tích cực của tôi, nhưng không thể tìm thấy câu trả lời cho cái này:Sử dụng Qt tín hiệu/khe với chủ đề không Qt

Làm thế nào để cơ chế/khe Qt tín hiệu tương tác với chủ đề không Qt?

Cụ thể, có an toàn khi phát ra một tín hiệu từ một chuỗi không phải Qt (ví dụ: TBB), để bị bắt bởi một vị trí trong vòng lặp sự kiện chính của tôi không? Giả sử tôi kết nối nó với một kết nối xếp hàng một cách rõ ràng? (Cảm giác của tôi là xác định rằng kết nối được xếp hàng sẽ là bắt buộc; điều này có đúng không?)

(Là câu hỏi phụ, tôi đã giả định rằng, các lớp đồng bộ hóa Qt, ví dụ: QMutex, Đây có phải là chính xác không?)

(Như một nhận xét rõ ràng, điều mà tôi lo ngại là cơ chế kết nối xếp hàng sẽ không sử dụng các vệ sĩ, ví dụ như mutexes, để thêm metacall vào hàng đợi sự kiện chủ đề chính nếu nó không phát hiện thấy tín hiệu đang được phát ra từ một chuỗi Qt khác.)

(Ngoài ra cuối cùng: Tôi có thể tin rằng vì các cơ chế Qt được thực hiện trên nền tảng- . Nguyên thủy cụ thể, mà trong thực tế tất cả những điều mà tôi đang cố gắng để làm sẽ chỉ làm việc một cách duyên dáng, nhưng tôi cũng đang tự hỏi nếu Qt cung cấp bất kỳ đảm bảo rằng những điều này sẽ làm việc)

Trả lời

9

Các documentation trạng thái:

Lưu ý: Các lớp luồng của Qt được triển khai với API luồng gốc; ví dụ: Win32 và pthreads. Do đó, chúng có thể được sử dụng với các luồng của cùng một API gốc.

Vì vậy, có, các nút của Qt sẽ hoạt động với các chủ đề khác (miễn là chúng cũng sử dụng cùng một API gốc).

Sự khác biệt giữa các chuỗi Qt và các chủ đề khác là các luồng khác sẽ không bao giờ có vòng lặp sự kiện Qt đang chạy, do đó sẽ không thể nhận và xử lý bất kỳ tín hiệu nào. Tuy nhiên, nếu bạn sẽ chạy vòng lặp sự kiện (exec) bên trong một chuỗi như vậy mọi thứ sẽ hoạt động tốt.

chức năng Tín hiệu liên quan, chủ yếu là processEvents và được cho là chủ đề an toàn:

Lưu ý: Chức năng này là thread-safe.

Nếu các đối tượng có các mối quan hệ chủ đề thiết lập một cách chính xác (bằng cách sử dụng phương pháp moveToThread), bạn không cần phải thiết lập các kết nối gõ một cách rõ ràng, mặc định AutoConnection công trình như sau:

(mặc định) Nếu tín hiệu được phát ra trong luồng mà đối tượng tiếp nhận có ái lực thì hành vi này giống với kết nối trực tiếp. Nếu không, hành vi cũng giống như Queued Connection.

This answer gợi ý rằng đề không Qt cũng nên được một cách chính xác mang tính chất bằng phương pháp Qt của - currentThread nên trở về một trường hợp QThread ngay cả đối với một sợi phi-Qt, vì nó chỉ là một wrapper qua đề bản địa.

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