Tôi đang cố gắng hiểu toàn bộ quá trình nội bộ của Qt và cách nó hoạt động khi tôi làm việc với các luồng khác nhau.Qt Main-Gui và các chủ đề + sự kiện khác vòng
Như tôi đã hiểu (googling và khám phá mã nguồn Qt), là như sau:
- Mỗi thread có "chờ xử lý danh sách sự kiện" địa phương và một vòng lặp sự kiện địa phương (nếu tôi gọi để
exec
) tương tác với danh sách đó. QCoreApplication::postEvent(obj, e)
nối cặp(obj, e)
vào "danh sách sự kiện đang chờ xử lý" của chuỗi củaobj
.- Mỗi chuỗi có một "điều phối sự kiện" địa phương (
QAbstractEventDispatcher
chuyên môn), mục đích là đọc sự kiện hệ thống. Vì vậy, nó tồn tại mộtQEventDispatchWin
, mộtQEventDispatchUnix
, mộtQEventDispatchSymbian
v.v., cho các nền tảng khác nhau. Đối vớigui
sự kiện, Qt có cũngQEventDispatchX11
(thừa hưởng từQEventDispatchUnix
),S60
(từSymbian
) vv
Với tất cả điều này trong tâm trí, một cuộc gọi exec
hoạt động như sau:
Thread's `exec`:
├ create a QEventLoop object.
└ call QEventLoop.exec()
└ call repeatedly eventDispatcher's processEvents with WaitForMoreEvents flag.
├ call to QCoreApplication::sendPostedEvents
├ while (!pending system events)
│ ├ read system event
│ ├ create an appropiate QEvent e and detect its target QObject o.
│ └ call to QCoreApplication::sendSpontaneousEvent(o, e)
└ call to QCoreApplication::sendPostedEvents
(for new generated user events in the previous step).
Nếu quit
hoặc exit
được gọi, nó kết thúc cuộc gọi processEvents
hiện tại và exec
trả về với giá trị được chuyển đến exit
.
Một số điểm để mất trong việc xem xét:
- Hệ thống các sự kiện không bao giờ đẩy/đăng: khi chúng được tạo ra từ hệ thống và dịch là QEvents, họ đang sended trực tiếp đến đối tượng mục tiêu của nó.
- Chức năng thành viên đối tượng mục tiêu (
o.event()
) được gọi trong cùng một chuỗi nơiprocessEvent
diễn ra.
Và bây giờ, nghi ngờ:
- Kể từ
postEvent
là một hàm tĩnh và thread-safe, vai trò gì QCoreApplication chơi trong hệ thống xử lý sự kiện này? Và QApplication? Tại sao chúng bắt buộc phải được tạo càng sớm càng tốt? - Tại sao QApplication/QCoreỨng dụng là bắt buộc để nhận sự kiện hệ thống, nếu mỗi Chủ đề có "điều phối sự kiện" riêng của mình?
Bất kỳ sửa chữa nào về sự ủng hộ của tôi đều được hoan nghênh.
Xin lỗi vì đã đánh dấu câu trả lời của bạn là câu trả lời quá muộn. Tôi đã không nhận ra nó cho đến hôm nay. –