2012-06-27 22 views
5

Tôi đã tìm hiểu một số mã nguồn mà tôi đang làm việc. Tôi tìm thấy một tuyên bố đặc biệt mà ai đó đã mã hóa. Mã nguồn là một ứng dụng GUI với giao diện QML và sử dụng QT 4.7.x.Lớp dựa trên QObject có kết nối xếp hàng với chính nó

Đoạn mã dưới đây thuộc về logic ứng dụng cốt lõi.

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

Thật lạ khi đối tượng kết nối với chính nó thông qua kết nối được xếp hàng đợi về cơ bản có nghĩa là đối tượng có thể "sống" trong các chủ đề khác nhau cùng một lúc?

Thoạt nhìn Nó không có ý nghĩa gì với tôi. Bất cứ ai có thể nghĩ ra bất kỳ lý do tại sao một kết nối như vậy sẽ là chính đáng hoặc cần thiết ?. Điều này thậm chí sẽ làm việc?

Trả lời

9

Nó sẽ hoạt động mà không có bất kỳ vấn đề gì. Có lẽ đã có một số xử lý vòng lặp sự kiện cần thiết trước khi gọi SetCurrentTaskSlot?

Lưu ý rằng QueuedConnection không có nghĩa là nội dung nào đó nằm trong chuỗi khác. QueuedConnection chỉ có nghĩa là khi tín hiệu được phát ra, khe tương ứng sẽ không được gọi trực tiếp. Nó sẽ được xếp hàng đợi trên vòng lặp sự kiện và sẽ được xử lý khi điều khiển sẽ được đưa trở lại vòng lặp sự kiện

+0

Làm cho tinh thần. Tôi vẫn đang xem xét những thứ xung quanh mã. Vì vậy, tôi sẽ trở lại một khi nó rõ ràng những gì đang xảy ra. –

+1

Vì vậy, có vẻ như một tín hiệu thay đổi nhiệm vụ được phát ra trong khi thực hiện một số tính toán và rằng "thay đổi" không nên xảy ra ngay lập tức, nhưng sau khi dòng chảy hiện tại được thực hiện và xử lý sự kiện tiếp tục. –

3

Kết nối xếp hàng ngụ ý không có gì về nơi người nhận sống. Điều ngược lại là đúng: để gửi tín hiệu an toàn đến một đối tượng sống trong một chủ đề khác, bạn phải sử dụng các kết nối được xếp hàng đợi. Nhưng bạn có thể sử dụng chúng cho một đối tượng sống trong bất kỳ chủ đề nào!

Một sử dụng kết nối được xếp hàng đợi để đảm bảo rằng tín hiệu sẽ được gửi từ trong vòng lặp sự kiện và không ngay lập tức từ trang web phát ra như xảy ra với kết nối trực tiếp. Kết nối trực tiếp là một tập hợp các cuộc gọi đến các con trỏ hàm trên danh sách. Kết nối xếp hàng là khái niệm một sự kiện được gửi đến một người nhận thông minh, người có thể thực thi một cuộc gọi hàm dựa trên nội dung của sự kiện.

Sự kiện là nội bộ QMetaCallEvent và là QObject::event hoạt động khi sự kiện này diễn ra cuộc gọi.

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