wxWidgets wxWinCE сбой приостановки-возобновления (VC ++) - PullRequest
3 голосов
/ 20 декабря 2011

У меня проблема с несколькими устройствами Windows CE 5.0, которые практически полностью выходят из строя при выходе из режима ожидания (приостановки). Я сократил проблему до примерно 15 строк C ++, чтобы просто получить wxWidgets для отображения окна сообщения, и проблема возникнет, если я:

  1. Запустить приложение
  2. Приостановить работу устройства (под этим я подразумеваю кратковременное нажатие красной кнопки питания)
  3. Возобновить работу устройства
  4. Нажатие кнопки ОК в заголовке окна сообщения.
  5. БУМ

Эта проблема проявилась во многих других аспектах, прежде чем я сократил ее - при загрузке растрового изображения, при сканировании штрих-кода, все после того, как оно было приостановлено, а затем возобновлено.

Я использую следующее:

  1. Windows CE 5.0 Professional (устройство Motorola MC3090) (также WM 6,5 (MC55), CE 6,0 (MC3190))
  2. Visual Studio 2005 SP2
  3. wxWidgets 2.8.10
  4. Microsoft Windows CE 5.0 Стандартный SDK

Фактическая отображаемая ошибка является спорадической и широко распространенной, но в основном это нарушение прав доступа, обычно рядом с начальным адресом вызова функции (обнаруживается это путем приостановки устройства, возобновления и последующего подключения отладчика VS к устройству). Проделав обширную домашнюю работу по этому вопросу, я прочитал несколько предложений о том, что может происходить какая-то кучная коррупция. Пока приложение не приостанавливается, оно всегда работает правильно для всех правильных комбинаций SDK и устройств.

Я также пробовал следующие SDK:

  1. MS Pocket PC 2003 SDK
  2. Symbol Platform SDK для MC3000c50a
  3. Symbol Platform SDK для MC3000c50b
  4. Windows Mobile 5.0 SDK
  5. Windows Mobile 6.0 SDK

Я протестировал следующие устройства:

  1. MC3090 (Windows CE 5.0) - та же проблема
  2. MC55 (Windows Mobile 6.5) - та же проблема
  3. MC3190 (Windows CE 6.0) - Проблема не возникает на этом устройстве со сборкой StandardSDK

Я слишком много играл с настройкой wxWidgets, всегда следя за тем, чтобы я связывал приложение с соответствующим соответствующим SDK.

Вот код, который вызывает эту проблему:

#include "wx/wxprec.h"
class Application : public wxApp {
public:
    virtual bool OnInit();
};

bool Application::OnInit() {
    wxMessageBox(L"Test");
    return true;
}

IMPLEMENT_APP(Application)

Любой, у кого есть какой-нибудь совет, буду вечно благодарен! Пожалуйста, дайте мне знать, если я пропустил какие-либо важные детали.

1 Ответ

2 голосов
/ 23 мая 2013

Запускаете ли вы приложение с SD-карты?По крайней мере, MC3090, а также, по-моему, и MC55, по умолчанию соответствуют стандарту Windows CE для дополнительных шин (изначально определенному для плат PCMCIA): когда вы приостанавливаете и возобновляете работу устройства, все шины сбрасываются.Это приводит к тому, что карта на мгновение исчезает, и все дескрипторы файлов, открытых на карте, становятся недействительными.Это на самом деле так, что устройство может иметь дело с пользователем, меняющим карту, пока устройство приостановлено.

Windows CE - это страничная операционная система.Ваша программа не все загружается в ОЗУ при запуске: вместо этого страницы загружаются только из исполняемого файла и библиотек DLL, так как на них ссылается программа.Любые доступные только для чтения или неизмененные страницы могут быть удалены ОС в любое время, потому что она может перечитать их из исходного файла программы (вот почему ваш программный файл не может быть перезаписан, если программа выполняется).Если дескриптор EXE или DLL является недействительным, и вы ссылаетесь на страницу, которая не была загружена (или была удалена), обработчик ошибок страницы ОС не может прочитать страницу и генерирует исключение нарушения прав доступа.

Для MC3090 вы можете настроить драйвер SD-карты так, чтобы она не «удаляла» карту при выходе из спящего режима.Подробнее см. Статью базы знаний Symbol MC30xx CE5.0 - случайное прерывание работы приложения при использовании SD-карты .Я не могу найти подробную информацию о том, как это сделать на MC55.На MC70 на панели управления системой был апплет SDSwitch, основной функцией которого было переключение между картой памяти и режимом SDIO, но также имел флажок для управления этой опцией.На некоторых других устройствах в папке \ Windows есть CAB-файл «запечатанный слот SD» - я, кажется, вспомнил об этом на MC65 или ES400.

...