loại khác nhau của hệ điều hành xử lý ngắt phải đặt tin nhắn trong 'hàng đợi thông điệp nói ', nhưng ở đâu trong không gian địa chỉ quy trình, hàng đợi này có tồn tại không? Làm thế nào là nó tiếp xúc với mã xử lý ngắt?
Windows được liên kết với chủ đề. Mỗi luồng với một cửa sổ có một hàng đợi luồng trong không gian địa chỉ của tiến trình. Hệ điều hành có một hàng đợi nội bộ trong không gian địa chỉ riêng của nó cho các sự kiện do phần cứng tạo ra. Sử dụng các chi tiết của sự kiện và thông tin trạng thái khác (ví dụ: cửa sổ nào có tiêu điểm), hệ điều hành dịch các sự kiện phần cứng thành các thông điệp sau đó được đặt trong hàng đợi luồng thích hợp.
Thư được đăng được đặt trực tiếp trong hàng đợi chuỗi cho cửa sổ mục tiêu.
Thư được gửi thường được xử lý trực tiếp (bỏ qua hàng đợi).
Chi tiết có được lông. Ví dụ, hàng đợi chủ đề có nhiều hơn danh sách thư - chúng cũng duy trì một số thông tin trạng thái. Một số tin nhắn (như WM_PAINT) không thực sự xếp hàng đợi, nhưng được tổng hợp từ thông tin trạng thái bổ sung khi bạn truy vấn hàng đợi và nó trống. Tin nhắn được gửi đến các cửa sổ thuộc sở hữu của các chủ đề khác thực sự được gửi lên hàng đợi của người nhận thay vì được xử lý trực tiếp, nhưng hệ thống làm cho nó xuất hiện như một sự chặn thường xuyên gửi từ quan điểm của người gọi. Hilarity xảy ra nếu điều này có thể gây ra bế tắc (vì vòng tròn gửi trở lại luồng ban đầu).
Sách Jeffrey Richter có rất nhiều (tất cả?) Của các chi tiết đẫm máu. Ấn bản của tôi là cũ (Advanced Windows). Ấn bản hiện tại có vẻ được gọi là Windows via C/C++.
Hệ điều hành làm rất nhiều công việc để làm cho luồng thông điệp xuất hiện hợp lý (và tương đối đơn giản) cho người gọi.
Điều gì có nghĩa là 'dịch' thư? Cuộc gọi tới TranslateMessage() thực sự làm gì?
Nó đồng hồ cho thông điệp chính ảo và khi nhận ra tổ hợp phím/khóa, nó sẽ thêm thông điệp ký tự. Nếu bạn không gọi số TranslateMessage, bạn sẽ không nhận được tin nhắn ký tự như WM_CHAR.
Tôi nghi ngờ nó sẽ gửi thông điệp nhân vật trực tiếp trước khi trở về (trái ngược với việc đăng chúng). Tôi chưa bao giờ kiểm tra, nhưng tôi dường như nhớ lại rằng các tin nhắn WM_CHAR đến ngay trước WM_KEYUP.
Sau khi được gửi bởi DispatchMessage(), mọi thông điệp sẽ chuyển đến đâu trước khi tiếp cận WndProc của tôi (tức là hệ điều hành sẽ làm gì với nó)?
DispatchMessage chuyển thư đến WndProc cho cửa sổ mục tiêu. Trên đường đi, một số móc có thể có cơ hội nhìn thấy thông điệp (và có thể can thiệp vào nó).
Tất cả đều sai. Các phần của nó là chính xác, là chính xác chỉ khi câu hỏi là về Win16, nơi toàn bộ hệ điều hành và các ứng dụng được hợp tác operativly theo lịch trình trên một chủ đề duy nhất. –