2011-07-29 4 views
3

wxWidgets에 이상한 문제가 있습니다. 다음 코드가 있습니다wxProgressDialog 어떻게 앱을 죽은 후에도 생생하게 유지할 수 있습니까?

MyFrame::OnDoSomeLongThing(...) { 
    progScreen = new wxProgressDialog(text,text,number,this,wxPD_AUTO_HIDE); // wxProgressDialog *progScreen is class member 
    doPartOfThing() // calls the update method at the end of it 
    .... 
    doLastPartOfThing() // again calls update method that pushes value to 100/100 
    progScreen->Destroy(); 
} 

MyFrame::update() { 
    progScreen->Update(newValue); 
} 

이제 여기 있습니다. 말 그대로 progScreen과 관련된 행을 주석 처리 할 수 ​​있습니다. 프로세스가 진행 대화 상자를 사용하지 않고 진행하도록합니다. 주 창을 닫을 때 내 앱이 정상적으로 종료됩니다.

그러나 진행 대화 상자를 사용하는 것만으로도 응용 프로그램의 수명이 연장됩니다. 나는 Destroy()를 시도해 봤는데, 간단히 'delete progScreen'을 시도했고, 매번 : 메인 프레임을 닫고, 프로세스가 계속 실행되며, 어떤 시점에서는 천문학적 숫자로 종료된다. 내가 생각할 수있는 유일한 것은 doPartsOfThings 메소드가 boost :: this_thread :: sleep을 호출 할 수 있다는 것입니다. 왜냐하면 그것은 내 모델 클래스에서 대기 중이고 그 외의 것들을 포함하기 때문입니다. 그러나이 이 내 문제와 관련이 없어야합니다. 아니면 어쩌면 ... 편집 : progScreen -> Update()가 메인 (GUI) 스레드에서 호출되고 있음을 강조하고 싶습니다.

그래서 내가 wxProgressDialog를 올바르게 사용하고 있습니까? 그렇지 않다면 어떻게 사용해야합니까?

도움 주셔서 감사합니다.

편집 :

음 ...이 제거 wxPD_AUTO_HIDE이 문제를 해결 것으로 나타났다. 나는 아직도 문제가 무엇인지는 모르겠지만 대화는 여전히 이전처럼 작동합니다. 앱이 예상대로 종료됩니다.

+0

는 어떻게 설정을 진보와 대화 사이의 부모 - 자식 관계가 무엇입니까? – Ajay

+0

'this'를 생성자의 부모 창 매개 변수에 전달했습니다. 이것도 편집에 기록했습니다. – cemulate

+0

자동 숨기기 스타일을 제거해보십시오. 대화 상자가 완료 될 때 삭제되는지 여부를 확인할 수 있습니다. 그렇지 않으면 대화 상자가 닫혀 있다고 가정하고 여전히 닫혀 있는지 여부를 알 수 없습니다. - 표시된 코드에 문제가 표시되지 않는 것처럼 들립니다. – UncleBens

답변

0

응용 프로그램을 닫는 wxApp 메서드를 재정 의하여 끝내야 wxProgressDialog 개체를 닫아야한다고 생각합니다.

wxApp는 ::

가상의 INT의 OnExit()

재정 애플리케이션이 종료하려고 같이 수행 할 필요가있는 처리를위한이 멤버 함수의 OnExit. OnExit은 이후 모든 응용 프로그램 윈도우와 컨트롤을 파괴하지만 wxWidgets 정리 전에 호출됩니다. OnInit이 실패하면 전혀 호출되지 않습니다.

이 함수의 반환 값은 현재 무시되며 기본 클래스 메서드에서 반환 한 값과 동일한 값인 을 반환합니다. progScreen 가정

당신은 뭔가를해야합니다, 당신의 프레임의 공개 속성

int myApp::OnExit() 
{ 
    (MyFrame*)(GetTopWindow())->progScreen->Destroy() 
    return wxApp::OnExit(); 
} 
+0

하지만 "모든 응용 프로그램 창과 컨트롤을 파괴 한 후에 호출되었습니다."... 그래서 MyFrame의 OnClose 메서드 내에서 progScreen을 파괴하지 않는 이유는 무엇입니까? 나는 이것을 시도하고 당신에게 돌아갈 것입니다. – cemulate

+0

이것이 wxDialog로하는 일이 아닌 것 같습니다. 견적서에 ** 창문이 파손 된 후에도 **라고 부릅니다. – UncleBens

+0

나쁜 소식 : 진행 대화 상자를 사용할 때, 무언가가 아직 살아 있기 때문에 OnExit은 정확하게 호출되지 않습니다. progScreen을 사용하지 않고 OnExit에 중단 점을 설정하면 해당 줄이 SEGFAULT를 트리거합니다. 즉, GetTopWindow()가 이미 파괴되었으므로 NULL입니다. – cemulate

관련 문제