Vấn đề lớn nhất là bạn không thể biết. Đó là, nếu bạn đang nhìn từ quan điểm của lớp. Khi bạn phát ra, bạn không biết những gì sẽ xảy ra:
- Nếu không có ai được kết nối với tín hiệu, không có gì xảy ra
- Nếu ai đó từ cùng một sợi được kết nối sử dụng bất kỳ loại trừ Qt :: QueuedConnection, cuộc gọi sẽ chặn
- Nếu ai đó từ cùng một chuỗi được kết nối bằng Qt :: QueuedConnection, cuộc gọi sẽ không bị chặn
- Nếu ai đó từ một chủ đề khác được kết nối bằng Qt :: DirectConnection (phải hết sức cẩn thận khi bạn làm điều đó!) hoặc Qt :: BlockingQueuedConnection, cuộc gọi sẽ chặn
- Nếu một người nào đó từ một chủ đề khác được kết nối bằng Qt :: AutoConnection hoặc Qt :: QueuedConnection, cuộc gọi sẽ không bị chặn
Sẽ khó khăn hơn nếu biết nhiều điều sẽ xảy ra nếu nhiều đối tượng được kết nối với tín hiệu. Trong trường hợp đó, một số vị trí có thể chạy trong khi các vị trí khác vẫn được xếp hàng đợi. Có, bằng cách này, không có chủ đề liên quan đến một kết nối không chặn. Chỉ có một sự kiện được đăng trong vòng lặp sự kiện của chuỗi của đối tượng nhận.
Nguồn
2009-08-28 18:54:19
Cũng lưu ý rằng theo mặc định: kết nối giữa các đối tượng trong cùng một luồng là trực tiếp (đồng bộ) và kết nối giữa các đối tượng trong các chuỗi khác nhau được xếp hàng đợi. Nếu bạn nghĩ về nó khá hợp lý. – quark
@quark Đó không chính xác. Nó không quan trọng nếu các đối tượng trong cùng một chủ đề hay không. Nó quan trọng nếu thread phát ra tín hiệu là luồng mà đối tượng nhận đang ở trong đó. Tài liệu Qt thậm chí còn nhận được lỗi này.Nguồn: [Tín hiệu và vị trí trên các chủ đề] (http://qt-project.org/wiki/Threads_Events_QObjects#913fb94dd61f1a62fc809f8d842c3afa). Tôi đồng ý rằng hành vi của Qt là hợp lý. –