Ứng dụng của tôi là một ứng dụng cửa sổ thực hiện các thuật toán toán học phức tạp nhất định. Bởi vì tôi đã bắt đầu với ứng dụng từ lâu, hầu hết nó vẫn là một luồng đơn. Để chính xác hơn, luồng chính thực hiện tất cả logic tính toán phức tạp. Điều quan trọng cần lưu ý là trong quá trình tính toán, tôi cho thấy một số tiến bộ trên màn hình.Cách đánh lừa Windows nghĩ rằng ứng dụng của bạn vẫn đang bận, mặc dù nó không phản hồi
Trong hầu hết các trường hợp, thuật toán toán học chỉ mất vài giây, vì vậy sau khi người dùng khởi động tác vụ, một đồng hồ cát (hoặc vòng tròn đang chạy trong Windows 7) được hiển thị và một vài giây sau đó kết quả được hiển thị.
Trong một số trường hợp, thuật toán có thể mất vài phút. Trong thời gian này, tôi hiển thị đồng hồ cát và khi thuật toán bận, tôi hiển thị tiến trình trong cửa sổ của mình. Tuy nhiên, nếu người dùng nhấp vào ứng dụng sau khi đã bận trong một thời gian, Cửa sổ sẽ trở nên 'trắng hơn' (như thể một miếng nhựa không hoàn toàn trong suốt được đặt trên cửa sổ), Cửa sổ sẽ không được cập nhật nữa và các báo cáo của Windows 'ứng dụng không phản hồi'.
Tôi sử dụng Qt và tôi sử dụng chức năng Qt QWidget :: repaint để buộc một repaint trong khi thuật toán của tôi đang bận. Các repaint hoạt động trong một thời gian, nhưng như đã nói ở trên, Windows dường như để ngăn chặn điều này sau một thời gian.
Cách chính xác để cho Windows biết rằng ứng dụng của bạn vẫn đang bận để cửa sổ luôn cập nhật? Nếu tôi nhập một vòng lặp thông báo rõ ràng, người dùng có thể kích hoạt các hành động khác trong ứng dụng mà tôi không muốn.
- Đủ để gọi PeekMessage?
- Đủ để gọi GetMessage là đủ?
- Hoặc tôi có nên gọi DispatchMessage không? Tôi có thể gọi một trong các thông báo này mỗi khi tôi cập nhật cửa sổ, hoặc tôi có thể giới hạn bản thân mình để gọi nó mỗi vài giây (10 giây). ?, 30 giây? ...)
Lưu ý rằng việc chuyển logic tính toán sang một chuỗi riêng biệt hiện không phải là một tùy chọn.
Tôi đang sử dụng Visual Studio 2010 trên Windows 7, kết hợp với Qt 4.7.
Re "người dùng có thể kích hoạt các hành động khác trong ứng dụng mà tôi không muốn." Vì vậy, vô hiệu hóa các điều khiển đó. – ikegami