Como suspender um aplicativo (DirectX e C++)

Este tópico mostra como salvar dados importantes do aplicativo e do estado do sistema quando o sistema suspende o aplicativo do Tempo de Execução do Windows em DirectX com C++.

Registrar o manipulador de eventos de suspensão

Primeiro, registre para manipular o evento CoreApplication::Suspending, que é acionado quando seu aplicativo é movido para um estado suspenso por uma ação do usuário ou sistema.

Adicione este código a sua implementação do método IFrameworkView::Initialize de seu provedor de visualizaçao (nomeado MyViewProviderno exemplo):



using namespace concurrency;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::UI::Core;
using namespace Windows::UI::ViewManagement;

MyViewProvider::MyViewProvider() :
    // class fields
    // ...
    bool m_visible;
    bool m_windowsClosed;
{

}

void MyViewProvider::Initialize(
    _In_ CoreApplicationView^ applicationView
    )
{

   // ...

    CoreApplication::Suspending +=
        ref new EventHandler<SuspendingEventArgs^>(this, &MyViewProvider::OnSuspending);

   // ...

}


Salve quaisquer dados de aplicativo antes de suspender

Quando manipula o evento CoreApplication::Suspending, o aplicativo tem uma oportunidade de salvar seus dados importantes na função do manipulador. O aplicativo deve usar a API de armazenamento LocalSettings para salvar dados simples do aplicativo de maneira síncrona. Se você estiver desenvolvendo um jogo, salve quaisquer informações de estado de jogo crítico. Não se esqueça de suspender o processamento de áudio!

Agora, implemente a chamada de retorno. Salve os dados do aplicativo neste método.


void App::OnSuspending(
    _In_ Platform::Object^ sender,
    _In_ Windows::ApplicationModel::SuspendingEventArgs^ args
    )
{
    Windows::ApplicationModel::SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral();

   // Save application data

    deferral->Complete();
}

Esta chamada de retorno deve ser concluída dentro de 5 segundos. Durante esta chamada de retorno, você deverá solicitar um adiamento chamando SuspendingOperation::GetDeferral, que inicia a contagem regressiva. Quando seu aplicativo concluir a operação de salvar, chame o SuspendingDeferral::Complete para informar o sistema que seu aplicativo agora está pronto para ser suspenso. Se você não solicitar um adiamento ou se o seu aplicativo demorar mais que 5 segundos para salvar os dados, ele será suspenso automaticamente.

Esta chamada de retorno ocorre como uma mensagem de evento processada pelo CoreDispatcher para o CoreWindowdo aplicativo. Essa chamada de retorno não será solicitada se você não chamar o CoreDispatcher::ProcessEvents a partir do loop principal do aplicativo (implementado no método IFrameworkView::Run de seu provedor de visualização).


// m_visible and m_windowsClose are class-level bool variables on MyViewProvider.

// ...

void MyViewProvider::Run()
{
    // your app's main loop!
    while (!m_windowClosed) // the app window is NOT closed
    {
        if (m_visible) // and if the app window is visible
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(
                                                           CoreProcessEventsOption::ProcessAllIfPresent
                                                           );
        }
        else 
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(
                                                           CoreProcessEventsOption::ProcessOneAndAllPending
                                                           );
        }
    }
}

Chamar Trim()

A partir do Windows 8.1, todos os aplicativos da Windows Store do DirectX têm que chamar IDXGIDevice3::Trim no momento da suspensão. Essa chamada pede para o driver gráfico liberar todos os buffers temporários alocados no aplicativo, evitando que o aplicativo seja encerrado para recuperar recursos de memória durante o estado de suspensão. Esse é um requisito de certificação do Windows 8.1.


void App::OnSuspending(
    _In_ Platform::Object^ sender,
    _In_ Windows::ApplicationModel::SuspendingEventArgs^ args
    )
{
    Windows::ApplicationModel::SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral();

   // Save application data

    m_exampleDxgiAdapter->Trim();
    deferral->Complete();
}

Observação  Nos modelos do Windows 8.1 DirectX, o adaptador DXGI é usado pelo objeto manipulador de recursos do dispositivo do modelo. Os modelos já incluem o código necessário que notifica o objeto de recursos do dispositivo para chamar IDXGIDevice3::Trim durante a suspensão.

Liberar manipuladores de recursos e arquivos exclusivos

Quando seu aplicativo manipula o evento CoreApplication::Suspending, ele também tem a oportunidade de liberar indicadores de arquivos e recursos exclusivos. Liberar explicitamente os indicadores de arquivos e recursos exclusivos ajuda a garantir que outros aplicativos possam acessá-los quando não estiverem sendo usados pelo seu aplicativo. Quando o aplicativo for ativado após o encerramento, ele deverá abrir seus indicadores de arquivos e recursos exclusivos.

Comentários

O sistema suspende o aplicativo quando o usuário alterna para outro aplicativo ou área de trabalho. O sistema retoma o aplicativo quando o usuário alterna de volta para ele. Quando o sistema retoma o aplicativo, o conteúdo das variáveis e estruturas de dados é o mesmo de antes da suspensão do aplicativo pelo sistema. O sistema retoma o aplicativo exatamente de onde parou, o que faz parecer ao usuário que ele estava sendo executado em tela de fundo.

O sistema tenta manter o aplicativo e seus dados na memória enquanto ele está suspenso. Entretanto, caso não tenha recursos suficientes para manter o aplicativo na memória, o sistema encerra o aplicativo. Quando o usuário alterna de volta para um aplicativo suspenso que foi encerrado, o sistema envia um evento Activated e deve restaurar os dados do aplicativo em seu manipulador para o evento CoreApplicationView::Activated.

O sistema não notifica o aplicativo quando ele é encerrado. Portanto, o aplicativo deve salvar os dados de aplicativo e liberar os indicadores de arquivos e recursos exclusivos quando estiver suspenso e restaurá-los quando for ativado após o encerramento.

Tópicos relacionados

Como retomar um aplicativo (DirectX e C++)
Como ativar um aplicativo (DirectX e C++)
Diretrizes para suspensão e reinício de um aplicativo
Ciclo de vida do aplicativo (aplicativos da Loja)

 

 

Mostrar:
© 2015 Microsoft