2012-01-11 3 views
6

문제는 다음과 같습니다. 응용 프로그램이 실제로 아무것도하지 않는 동안 닫히면 제대로 종료됩니다. 그러나 (예를 들어 while 루프에서 기다리는) 무언가에 적극적으로 작업하는 경우 주 창은 닫히지 만 작업 관리자를 열어 프로그램이 백그라운드에서 계속 실행됩니다.MainWindow가 닫힌 후에도 Qt 앱이 계속 메모리에 남아 있습니다.

저는 현재 문제를 조사하고 가능한 수정 사항을 구현하는 데 많은 시간을 보냈지만 아무 소용이 없었습니다. quit() 함수는 단순히 아무 것도하지 않는 것처럼 보입니다. 다음은 시도한 몇 가지 사항입니다.

  • app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));을 사용합니다. &app, SLOT(quit())qApp, SLOT(aboutQt())으로 변경하려고 시도 했으므로 신호가 트리거되었음을 알고 약 aboutQt 창이 잠시 나타납니다.
  • 주 창 단추에서 실행되는 기능의 시작 부분에 qApp->quit();을 포함합니다. 응용 프로그램은 해당 행으로 실행되지만 효과는 없습니다.
  • processEvents()을 사용하여 GUI가 업데이트되고 있는지 확인하십시오.
  • mainWindow.setAttribute(Qt::WA_QuitOnClose);과 같은 문을 main.cpp에 포함합니다.

주 창을 닫을 때 응용 프로그램을 완전히 종료하기 만하면됩니다.

차이점이 있으면 qextserialport 라이브러리를 사용하고 있습니다.

+0

응용 프로그램이 다중 스레드입니까? – Lol4t0

+0

개인적으로 스레드를 만들지는 않지만 사용중인 라이브러리가 있는지 확실하지 않습니다. 디버거를 열고 스레드에서 보면 "ntdll! ldrFindResourceEx_U"함수가 많이 표시됩니다. 그래도 작업 관리자 프로세스에서 내 프로그램 인스턴스 하나만 볼 수 있습니다. 추신 : 왜 도대체 입력하면 줄 바꿈을 만드는 대신 메시지를 보내겠습니까? – SharpHawk

+0

그러면 주 스레드가 작업을 마칠 때까지 스레드를 기다릴 수 있습니다. 암묵적으로 수행 할 수 있습니다. 예를 들어 객체의 소멸자가 스레드가 완료 될 때까지 대기 할 수 있습니다. 도서관 코드를 연구해야합니다. PS qextserialport'는 내가 아는 한 어떤 쓰레드도 생성하지 않습니다. – Lol4t0

답변

1

무엇이 잘못된 것인지 잘 모르겠지만 슬롯에 실제로 신호가 수신되면 해당 슬롯 기능에서 회신하여 exit()을 호출 할 수 있습니다.

+0

난 그게 나쁜 해결책이라고 생각하기 때문에 다른 스레드에서 응용 프로그램 프로세스 뭔가, 그런 종료 후, TS는 일부 데이터가 손상받을 수 있기 때문에 – Lol4t0