2012-01-11 54 views
6

Vấn đề là như sau: nếu ứng dụng được đóng trong khi nó không chủ động làm bất cứ điều gì, nó thoát đúng cách. Nếu nó tích cực làm việc trên một cái gì đó (chờ đợi trong một vòng lặp while, ví dụ), tuy nhiên, cửa sổ chính sẽ đóng nhưng chương trình sẽ tiếp tục chạy trong nền, như được xác nhận bằng cách mở trình quản lý tác vụ.Ứng dụng Qt vẫn còn trong bộ nhớ ngay cả sau khi MainWindow bị đóng

Tôi đã dành phần lớn thời gian hôm nay để giải quyết vấn đề và triển khai các bản sửa lỗi có thể, nhưng vô ích. Có vẻ như hàm quit() đơn giản là không làm gì cả. Dưới đây là một số điều tôi đã thử:

  • Sử dụng app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));. Tôi biết tín hiệu được kích hoạt, bởi vì tôi đã thử thay đổi &app, SLOT(quit()) thành qApp, SLOT(aboutQt()) và cửa sổ aboutQt xuất hiện một thời gian ngắn.
  • Bao gồm qApp->quit(); ở đầu hàm chạy từ nút cửa sổ chính. Ứng dụng chạy đến dòng đó, nhưng nó không có hiệu lực.
  • Sử dụng processEvents() để đảm bảo GUI đang được cập nhật.
  • Bao gồm các câu như mainWindow.setAttribute(Qt::WA_QuitOnClose); trong main.cpp.

Tôi chỉ muốn ứng dụng thoát hoàn toàn khi cửa sổ chính đóng.

Tôi đang sử dụng thư viện qextserialport, nếu điều đó tạo ra bất kỳ sự khác biệt nào.

+0

Ứng dụng của bạn có đa luồng không? – Lol4t0

+0

Tôi không phải là cá nhân tạo chủ đề, nhưng tôi không chắc chắn nếu thư viện tôi đang sử dụng là. Nếu tôi mở trình gỡ rối và xem theo chủ đề, tôi sẽ thấy một loạt các hàm "ntdll! LdrFindResourceEx_U". Tuy nhiên, tôi chỉ thấy một ví dụ của chương trình của tôi trong các quy trình quản lý tác vụ. PS: Tại sao địa ngục sẽ nhấn enter gửi tin nhắn thay vì tạo ra một linebreak? – SharpHawk

+0

Sau đó, chủ đề chính của bạn có thể chờ đợi những chủ đề để hoàn thành công việc của họ. Nó có thể được thực hiện hoàn toàn, ví dụ, destructors của các đối tượng có thể chờ đợi cho thread để kết thúc. Bạn nên nghiên cứu mã thư viện của mình. PS 'qextserialport', theo như tôi biết không tạo ra bất kỳ chủ đề nào. – Lol4t0

Trả lời

1

Tôi không biết có gì sai, nhưng khi vị trí của bạn thực sự nhận được tín hiệu, bạn có thể gọi exit() từ chức năng vị trí đó làm giải pháp thay thế.

+0

Tôi nghĩ rằng đó là một giải pháp tồi, bởi vì nếu ứng dụng xử lý một cái gì đó trong một chủ đề khác, sau khi chấm dứt như vậy, TS có thể nhận được một số dữ liệu bị hỏng – Lol4t0

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