Поделиться через


Возобновление приложения (DirectX и C++)

В этом разделе показано, как восстановить важные данные приложения, когда система возобновляет работу приложения DirectX универсальная платформа Windows (UWP).

Регистрация обработчика событий возобновления

Зарегистрируйтесь для обработки события CoreApplication::Resuming , которое указывает, что пользователь отключился от приложения, а затем вернулся к нему.

Добавьте этот код в реализацию метода IFrameworkView::Initialize поставщика представлений:

// The first method is called when the IFrameworkView is being created.
void App::Initialize(CoreApplicationView^ applicationView)
{
  //...
  
    CoreApplication::Resuming +=
        ref new EventHandler<Platform::Object^>(this, &App::OnResuming);
    
  //...

}

Обновление отображаемого содержимого после приостановки

Когда приложение обрабатывает событие возобновления, оно имеет возможность обновить отображаемое содержимое. Восстановите любое приложение, сохраненное с помощью обработчика CoreApplication::Suspending, и перезапустите обработку. Разработчики игр: если вы приостановили звуковой механизм, пришло время перезапустить его.

void App::OnResuming(Platform::Object^ sender, Platform::Object^ args)
{
    // Restore any data or state that was unloaded on suspend. By default, data
    // and state are persisted when resuming from suspend. Note that this event
    // does not occur if the app was previously terminated.

    // Insert your code here.
}

Этот обратный вызов происходит как сообщение о событии, обработанное CoreDispatcher для coreWindow приложения. Этот обратный вызов не будет вызываться, если вы не вызываете CoreDispatcher::P rocessEvents из основного цикла приложения (реализовано в методе IFrameworkView::Run поставщика представлений).

// This method is called after the window becomes active.
void App::Run()
{
    while (!m_windowClosed)
    {
        if (m_windowVisible)
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);

            m_main->Update();

            if (m_main->Render())
            {
                m_deviceResources->Present();
            }
        }
        else
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
        }
    }
}

Замечания

Система приостанавливает приложение всякий раз, когда пользователь переключается на другое приложение или на рабочий стол. Система возобновляет работу приложения всякий раз, когда пользователь переключается на него. Когда система возобновляет работу приложения, содержимое переменных и структур данных совпадает с тем, что было до того, как система приостановила приложение. Система восстанавливает приложение точно там, где оно осталось, чтобы он отображался пользователю, как если бы он работал в фоновом режиме. Однако приложение может быть приостановлено в течение значительного времени, поэтому оно должно обновить любое отображаемое содержимое, которое могло измениться во время приостановки приложения, и перезапустить все потоки отрисовки или обработки звука. Если вы сохранили данные о состоянии игры во время предыдущего события приостановки, восстановите его сейчас.