2010-08-24 29 views
5

Tôi đang làm việc trên một ứng dụng di động Qt khá chuẩn (được viết bằng C++, được nhắm mục tiêu vào thiết bị Symbian), và tôi thấy rằng đôi khi ứng dụng bị đóng (tức là qua cuộc gọi đến QApplication :: quit), destructor cuối cùng trong ứng dụng có thể mất một thời gian dài để quay trở lại (30 giây cộng). Điều này có nghĩa là, tất cả các hoạt động dọn dẹp trong destructor đã hoàn thành (nhanh chóng, tất cả trong vòng một giây) và chúng tôi đã đạt đến điểm mà thực hiện là rời khỏi destructor và quay trở lại mã mà ngầm gọi nó (tức là khi chúng ta xóa đối tượng).Qt C++ destructor mất một thời gian dài để trở về

Rõ ràng là tại thời điểm đó, tôi mong đợi việc thực hiện trở lại ngay sau khi cuộc gọi để xóa đối tượng, hầu như ngay lập tức, nhưng như tôi nói đôi khi điều này đang mất một tuổi!

Thời gian đóng cửa dài này xảy ra cả trong bản dựng gỡ lỗi và bản phát hành, với tính năng ghi nhật ký được bật hoặc tắt, vì vậy tôi không nghĩ đó là yếu tố ở đây. Khi chúng tôi đạt đến cuối của destructor tôi khá chắc chắn không có xử lý tập tin còn lại mở, hoặc bất kỳ tài nguyên mở khác (kết nối mạng vv) ... mặc dù ngay cả khi họ chắc chắn điều này sẽ không trình bày chính nó như là một vấn đề trên thoát khỏi destructor (?).

Thao tác này sẽ xóa đối tượng QMainWindow của ứng dụng. Hiện tại, cuộc gọi để thực hiện điều này là trong một khe được kết nối với QApplication :: aboutToQuit, mặc dù tôi đã thử xóa đối tượng đó trong ứng dụng "chính" chức năng quá.

Độ dài của độ trễ mà chúng tôi gặp phải có vẻ tỷ lệ thuận với số lượng hoạt động trong ứng dụng trước khi chúng tôi thoát. Điều này khiến tôi nghĩ rằng rò rỉ bộ nhớ có thể là một vấn đề ở đây, tuy nhiên chúng tôi không biết bất kỳ điều gì (không có nghĩa là có không phải là bất kỳ khóa học nào) và tôi cũng chưa từng thấy hành vi này trước đây ký ức.

Có ai có ý tưởng gì có thể xảy ra ở đây không?

Cheers

+0

Bạn có gặp phải sự cố này nếu bạn sử dụng trình gỡ lỗi không? Bạn có thể cô lập (các) dòng mã mất quá lâu không? –

+0

Vâng tôi cũng thấy điều này trong trình gỡ lỗi. Về mặt phân lập đoạn mã nào mất quá nhiều thời gian, vấn đề là sự chậm trễ xảy ra trong khi quay trở lại từ chính phá hủy. Vì vậy, dòng cuối cùng trong destructor đã hoàn thành thực hiện, chúng tôi sau đó bước ra khỏi destructor, và nó tại thời điểm này sự chậm trễ xảy ra. Tôi tin rằng khung Qt đang làm điều gì đó tại thời điểm đó gây ra sự chậm trễ, mặc dù tôi chưa biết điều gì. – busta83

Trả lời

4

Nếu destructor cuối cùng của bạn là dành cho một lớp học hơn được thừa hưởng QObject sau đó destructor QObject sẽ được gọi ngay sau khi destructor của đối tượng cuối cùng của bạn. Có lẽ đối tượng này là gốc của một cây đối tượng có thể lớn sẽ kích hoạt một số hành động xảy ra bao gồm cả việc gọi hàm hủy của tất cả các QObject con. Vì bạn nói rằng vấn đề được đáp ứng bởi số lượng hoạt động, có khả năng một số lượng rất lớn trẻ em được thêm vào cây đối tượng bị xóa vào thời điểm này, có lẽ nhiều hơn bạn dự định. Thay vì thêm tất cả các đối tượng vào một cây khổng lồ để xóa tất cả cùng một lúc. Xác định các đối tượng đang được tạo thường xuyên mà không cần phải tồn tại trong suốt quá trình thực thi. Thay vì tạo các đối tượng đó với cha, hãy bắt đầu một cây mới có thể bị xóa trước đó (parent = 0). Nhìn vào QObject :: deleteLater() sẽ đợi cho đến khi không có tương tác người dùng để xóa các đối tượng trong các cây độc lập này.

+0

Tôi đã bắt đầu xóa một số phần cha mẹ và sử dụng deleteLater thay vào đó và tôi thấy những cải tiến đáng chú ý trong thời gian hủy diệt. Công cụ tuyệt vời, cảm ơn! – busta83

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