2010-08-20 39 views

Trả lời

41

Một vài tuần trước, chúng tôi đã vô tình thực tập kết nối tín hiệu với một vị trí nhiều lần. Ý tưởng là trong một điều kiện, bạn sẽ có khe cắm được kết nối với tín hiệu, và trong một điều kiện khác, bạn sẽ ngắt kết nối nó. Khi bạn thay đổi chế độ, bạn sẽ thực hiện công việc phù hợp.

Vâng, anh ấy đã quên ngắt kết nối khi thích hợp. Vì vậy, mỗi lần bạn thay đổi chế độ, bạn đã có kết nối mới với khe.

Kết quả cuối cùng? 1 kết nối == 1 cuộc gọi đến khe. 2 kết nối == 2 cuộc gọi đến khe. 3 kết nối == 3 cuộc gọi đến khe, vv Những cuộc gọi này xảy ra "đồng thời" (tôi biết trong thực tế họ không kể từ khi họ đang trên cùng một chủ đề sự kiện, nhưng những gì tôi có nghĩa là tất cả các cuộc gọi đã được xử lý trong kế).

Vì @Job chỉ ra một trong các nhận xét của anh ấy (anh ấy xứng đáng được nhận tín dụng, vì vậy xin vui lòng không upvote tôi cho công việc của anh ấy), Qt::UniqueConnection sẽ ngăn chặn vấn đề này.

+1

+1: Đây là kịch bản cổ điển. – Troubadour

+53

Lưu ý rằng bạn có thể sử dụng [Qt :: UniqueConnection] (http://doc.trolltech.com/latest/qt.html#ConnectionType-enum) để ngăn chặn tình huống này. – Job

+0

@Job: Tôi sẽ thêm một câu trả lời kèm theo trong đó. Tôi không biết rằng nó đã được thêm vào Qt. Cảm ơn đã chỉ ra điều đó. – Troubadour

5

Thường là những điều xấu. Nó hoàn toàn có thể chấp nhận để kết nối khe hai lần hoặc thậm chí nhiều lần hơn nhưng khi tín hiệu được kích hoạt, khe cắm của bạn sẽ được gọi cho mỗi kết nối bạn đã thực hiện mà có lẽ không phải là thứ bạn muốn.

Lưu ý rằng không nhất thiết phải có nhiều kết nối. Có (có lẽ) sử dụng hoàn toàn hợp lệ cho nó. Chúng khá hiếm, tôi chắc chắn không thể nghĩ ra bất cứ lúc nào tôi sử dụng nó như một tính năng. Tất cả các tình huống tôi có thể nhớ lại khi có nhiều kết nối hóa ra là một lỗi thay vì dự định.

+0

Ok, trong file moc gì chính xác là có? doesnt nó có bất kỳ khả năng để xử lý các loại kịch bản của prpgramming sai lầm? – itapadar

+0

@itapadar: Tôi không nghĩ rằng họ bận tâm cố gắng ngăn chặn nó bởi vì nó có thể _not_ là một sai lầm. Tôi đã viết một số mã không lâu trước đây mà thực sự dựa vào tính năng đó trong một số tình huống. – Troubadour

+0

@itapadar: Trên thực tế suy nghĩ lại tôi đã không sử dụng nó như là một tính năng ở tất cả. Nó xuất hiện như một lỗi và tôi phải làm việc xung quanh nó. – Troubadour

5

Khe được thực hiện nhiều lần (như những người khác đã nói).

Một số chi tiết ghi chú:

  • Trong thời gian trước đây, mô hình cho "kết nối đúng một lần" trong trường hợp có thể có được một kết nối trước đây, là để ngắt kết nối cuộc gọi đầu tiên và sau đó kết nối để thực thi chính xác một kết nối .
  • Bây giờ, kể từ 4.6, đó cũng là thanh lịch hơn Qt :: UniqueConnection, xem http://doc.qt.io/qt-5/qt.html#ConnectionType-enum
+0

Tôi không chắc chắn đó là một giải pháp thanh lịch hơn. Thông thường mã phải đối xứng và nếu không thì đó là lỗi. Tôi lo lắng rằng 'Qt :: UniqueConnection' có thể được sử dụng để vá mã không đối xứng cẩu thả nhiều lần so với nó được sử dụng cho bất kỳ mục đích nào khác. – Troubadour

+0

Vâng, người ta có thể lập luận rằng cả hai cách tiếp cận "kết nối một lần" đều không tốt đẹp. OTOH, nếu bạn nhận được một vật được đưa từ nơi khác, có khả năng nhiều lần cùng một đối tượng, và tất cả những gì bạn phải làm là nghe một số tín hiệu (một lần), thì cách duy nhất tôi có thể nghĩ là giữ danh sách các đối tượng bạn đã thấy. Không tốt lắm. Và ngắt kết nối(), kết nối() là một chút mong manh, vì người ta phải cẩn thận để giữ cho chúng được đồng bộ hóa nếu có gì đó thay đổi. Vì vậy, tôi muốn UniqueConnection. Trong thực tế, tôi không thấy cách tiếp cận "kết nối một lần" rất thường xuyên vì vậy nó dường như không phải là một vấn đề lớn. –

+0

+1 cho con trỏ tới Qt :: UniqueConnection (mà tôi không biết trước đây) –

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