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
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? –
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