2011-08-09 57 views
8

Trong các hoạt động dài hạn, ứng dụng C++ Win32 của chúng tôi hiển thị hộp thoại trạng thái phương thức với thanh tiến trình, được cập nhật bất thường vài giây một lần. Bắt đầu với Windows 7, chúng tôi nhận ra rằng Windows khá sớm hiển thị một thông báo "dường như treo ..." và/hoặc nối thêm "Không phản hồi" vào thanh tiêu đề cửa sổ của chúng tôi.Ứng dụng bận sẽ dẫn đến trạng thái "Không phản hồi" trên Windows 7 - WM_UPDATE

Chúng tôi đã tìm ra rằng hộp thoại xử lý phải xử lý các tin nhắn để tránh điều này. Cụ thể hơn, có vẻ như Windows 7 liên tục gửi tin nhắn WM_UPDATE để kiểm tra xem chương trình của chúng tôi có còn hoạt động hay không. Chúng tôi trước đây đã vô hiệu hóa tất cả các xử lý tin nhắn không cần thiết trong hộp thoại này khi hồ sơ chạy cho thấy rằng họ là một chậm lớn. Tuy nhiên, mặc dù chúng tôi nghĩ rằng đã khắc phục sự cố đó, người dùng vẫn đang báo cáo lại vấn đề như vậy: Windows hiển thị "có vẻ treo ..." và/hoặc nối "Không phản hồi" vào thanh tiêu đề cửa sổ của chúng tôi, mặc dù chúng tôi xử lý mọi sự kiện vài giây.

Câu hỏi:

  • Có bất kỳ tài liệu về thay đổi hành vi này trong Windows 7 (hoặc Windows vista)? Chúng tôi đã không tìm thấy bất kỳ. Chúng tôi cũng tìm thấy một số thay đổi khác về hành vi nhắn tin.

  • Có cách nào để vô hiệu hóa tất cả các kiểm tra "còn sống" đó từ cửa sổ không? Ứng dụng của chúng tôi khá tốt và các quá trình có thể mất nhiều thời gian.

EDIT: Để cụ thể hơn - những gì chúng tôi chỉ làm mỗi vài giây đang kêu gọi các máy bơm thông điệp PeekMessage/TranslateMessage/DispatchMessage.

Vì đây là một chương trình cũ khá cũ nên không thể sử dụng chuỗi công nhân riêng trong tương lai gần. Tất nhiên chúng tôi làm điều đó cho mã mới. Xin lưu ý rằng điểm chính của tôi là hành vi này chắc chắn đã thay đổi với Windows vista/Windows 7. Tôi chưa tìm thấy bất kỳ tài liệu nào ở đó.

+1

Điều này phát ra cho một chuỗi công nhân nền. – Deanna

+2

"vô hiệu hóa tất cả ** không cần thiết ** xử lý tin nhắn" - MSDN là khá rõ ràng về chủ đề này: "Nếu [một thủ tục cửa sổ] không xử lý một tin nhắn, nó ** phải ** gửi tin nhắn trở lại hệ thống để xử lý mặc định Quy trình cửa sổ thực hiện điều này bằng cách gọi hàm 'DefWindowProc'." – MSalters

+0

Vui lòng xem Chỉnh sửa của tôi –

Trả lời

18

Vâng, câu trả lời trực tiếp cho câu hỏi của bạn là bạn có thể gọi DisableProcessWindowsGhosting().

Tuy nhiên, sẽ tốt hơn hết là giải quyết vấn đề gốc của vấn đề thay vì chặn các triệu chứng. Cửa sổ của bạn đang bị mờ vì bạn không bơm hàng đợi tin nhắn. Bạn không làm điều đó vì lý do đáng ngưỡng mộ rằng ứng dụng của bạn đang bận làm việc. Cách được chấp nhận để làm việc và giữ cho hàng đợi của bạn được bơm, là thực hiện công việc trong một sợi riêng biệt.

+0

Cảm ơn câu trả lời của bạn. Tài liệu nói "Cửa sổ ghosting là một tính năng Windows Manager cho phép người dùng thu nhỏ, di chuyển, hoặc đóng cửa sổ chính của ứng dụng không phản hồi." Nó không nói bất cứ điều gì về việc vô hiệu hóa "dường như treo lưu ý". Bạn có biết gì thêm về điều đó không? –

+2

Khi bạn vô hiệu hóa bóng mờ, bạn sẽ không thấy bất kỳ văn bản "(không phản hồi)" nào được đính kèm với chú thích, v.v. –

+0

Ngoài quan điểm UX, bằng cách sử dụng một chuỗi khác, bạn có thể sử dụng chuỗi hiện tại để cung cấp phản hồi cho người dùng của mình sự tiến bộ của nhiệm vụ của họ. – Ben

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