2012-08-13 5 views
2

내 프로그램이 모덜리스 대화 상자를 사용하여 사용자와 상호 작용하고 트레이 아이콘도 있습니다. 사용자는 트레이 아이콘을 사용하여 앱을 즉시 종료 할 수 있습니다.명령 메시지 처리기가 돌아 오기 전에 기본 대화 상자가 무효화됩니다.

BOOL OnInitDialog() 
{ 
    init data... 
} 

void OnDestroy() 
{ 
    destroy data... 
} 

void OnSomeButton() 
{ 
    CFileDialog dlg; 
    ... 
    dlg.DoModal(m_hWnd)); 
    access data... 
    ... 
} 

void OnMenuExit() 
{ 
    DestroyWindow(); 
} 

문제는 내가 모달 대화 상자 (OnSomeButton)를 팝업 한 후 트레이 아이콘 메뉴를 사용하여 종료 할 때, 주 대화가 먼저 파괴하고 모달 하나가 반환 될 때 시도하는 일부 잘못된 데이터에 액세스 할 수 있다는 것입니다 , 충돌을 일으켰습니다.

데이터에 액세스하기 전에 일부 체크 코드를 추가 할 수 있지만 다른 방법이 있습니까? 창을 닫기 전에 OnSomeButton()이 반환하도록 보장 할 방법이 있습니까?

+0

문제의 데이터가 유효하지 않은 이유는 무엇입니까? 어쨌든 응용 프로그램이 종료되면 할당 된 메모리를 확보 할 필요가 없습니다. 종료 할 때 해당 메모리가 해제되지 않도록 구조 조정하여 문제를 해결할 수 있습니다. –

+0

메모리를 비우지 않아도 윈도우가 파괴되어 예측할 수없는 앱 동작을 일으키는 일부 상태 데이터 내용이 무효화됩니다. – toki

답변

2

예. 용지함 메뉴에서 나가면 WM_CLOSE 또는 이와 유사한 메시지를 모달 대화 상자로 보내어 끝내게 할 수 있습니다. OnSomeButton이 반환되기 전에 주 창이 파괴 되더라도 그 함수의 나머지 부분은 클래스 내부 (멤버 변수 등)에 액세스하지 않는 한 괜찮습니다. 이런 식으로 닫을 때 모달 대화 상자의 창 proc이 '중단'코드 또는 무언가를 반환하도록함으로써 이것을 보장 할 수 있습니다.

+0

즉, 모달 대화 상자에 중단 코드를 추가하고 반환하면, 이 코드를 확인한 다음 추가 처리를 중지 하시겠습니까? – toki

+0

네 클래스의 코드 영역이 한 곳에 있기 때문에 클래스 객체가 사라진 후에도 객체를 액세스하지 않는다면 그 코드를 끝낼 수있다. 다른 방법은 모달 대화 상자의 클래스 자체에 값을 설정하고 테스트하는 것입니다. 하지만 그렇게하려면 스택에 객체를 생성하는 대신 힙에 객체를 할당해야합니다. 어느 쪽이든, 기본 창은 모달 대화 상자의 존재에 대한 지식을 유지해야합니다. HWND를 저장하거나 CDialog 포인터를 저장하십시오. 그리고 스레드 경합에주의하십시오. – paddy

3

응용 프로그램 수준 코드를 추가해야합니다. 주로이 문제에 대한 시스템 지원이 없기 때문에 일반적인 접근법이 불가능한 많은 분야가있을 수 있습니다.