当前位置: 代码迷 >> Windows Mobile >> PPC手机从待机到重启后网络重建有关问题
  详细解决方案

PPC手机从待机到重启后网络重建有关问题

热度:74   发布时间:2016-04-25 07:49:54.0
PPC手机从待机到重启后网络重建问题
PPC待机开机后网络连接会断开,必须重新激活网络,通常是怎样处理这个过程的呢?

激活网络->建立socket->工作->手机因某原因待机->网络断开->激活开机->怎样处理返回到第一步呢?

------解决方案--------------------
待机重新唤醒问题,一直都是WM比较棘手的问题之一呀~~~~

帮顶了。

我以前的做法是用定时器监视电池状态(GetSystemPowerState),不过效果不理想
------解决方案--------------------
系统唤醒当然会发消息,你要做的就是创建一个消息队列,然后等着系统发给你

C/C++ code
DWORD ResumeMonThread(LPVOID){    MSGQUEUEOPTIONS msgOptions = {0};     while(!IsAPIReady(SH_SHELL) || !IsAPIReady(SH_WMGR) || !IsAPIReady(SH_GDI))    {        Sleep(250);    }    wprintf(_T("ResumeMonThread TID = 0x%x\r\n"), GetCurrentThreadId());    // Create a message queue for Power Manager notifications.    msgOptions.dwSize        = sizeof(MSGQUEUEOPTIONS);    msgOptions.dwFlags       = 0;    msgOptions.dwMaxMessages = 0;    msgOptions.cbMaxMessage  = sizeof(POWER_BROADCAST) + MAX_NAMELEN;    msgOptions.bReadAccess   = TRUE;    g_hPMReadMsgQ = CreateMsgQueue(NULL, &msgOptions);    if ( g_hPMReadMsgQ == NULL )    {        DEBUGMSG(1, (TEXT("PWM: CreateMsgQueue(Read): error %d\r\n"), GetLastError()));        g_FlagExitThrd = TRUE;    }    // Request Power notifications    g_hPMNotifications = RequestPowerNotifications(g_hPMReadMsgQ, POWER_NOTIFY_ALL);    if ( ! g_hPMNotifications )     {        DEBUGMSG(1, (TEXT("PWM: RequestPowerNotifications: error %d\r\n"), GetLastError()));        g_FlagExitThrd = TRUE;    }    DebugOut(TEXT("ResumeMonThread: create thread success!!!"));    while(!g_FlagExitThrd)    {        DWORD iBytesInQueue = 0;        DWORD dwFlags;        UCHAR buf[QUEUE_SIZE];        PPOWER_BROADCAST pB = (PPOWER_BROADCAST) buf;        memset(buf, 0, QUEUE_SIZE);        DEBUGMSG(0, (TEXT("PWM: Waiting for PM state transition notification\r\n")));        // Read message from queue.        if ( ! ReadMsgQueue(g_hPMReadMsgQ, buf, QUEUE_SIZE, &iBytesInQueue, INFINITE, &dwFlags) )        {            DEBUGMSG(1, (TEXT("PWM: ReadMsgQueue: ERROR:%d\r\n"), GetLastError()));        }         else if ( iBytesInQueue < sizeof(POWER_BROADCAST) )        {            DEBUGMSG(1, (TEXT("PWM: Received short message: %d bytes, expected: %d\r\n"),                iBytesInQueue, sizeof(POWER_BROADCAST)));        }        else         {            switch ( pB->Message )            {            case PBT_TRANSITION:                //RETAILMSG(1, (TEXT("PWM: PBT_TRANSITION to system power state [Flags: 0x%x]: '%s'\r\n"), pB->Flags, pB->SystemPowerState));                switch ( POWER_STATE(pB->Flags) )                {                case POWER_STATE_ON:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_ON\r\n")));                    break;                case POWER_STATE_OFF:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_OFF\r\n")));                    break;                case POWER_STATE_CRITICAL:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_CRITICAL\r\n")));                    break;                case POWER_STATE_BOOT:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_BOOT\r\n")));                    break;                case POWER_STATE_IDLE:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_IDLE\r\n")));                    break;                case POWER_STATE_SUSPEND:                    DebugOut(TEXT("POWER_STATE_SUSPEND for resume mon\r\n"));                    break;                case POWER_STATE_RESET:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_RESET\r\n")));                    break;                case POWER_STATE_PASSWORD:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_PASSWORD\r\n")));                    break;                case  POWER_STATE_UNATTENDED:                    //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_UNATTENDED\r\n")));                    break;                case 0:                    //DEBUGMSG(1,(TEXT("PWM: Power State Flags:0x%x\r\n"),pB->Flags));                    break;                default:                    //DEBUGMSG(1,(TEXT("PWM: Unknown Power State Flags:0x%x\r\n"),pB->Flags));                    break;                }                break;            case PBT_RESUME:                {                    DebugOut(TEXT("PBT_RESUME\r\n"));                    if(g_hMainWnd != NULL)                    {                        ShowWindow(g_hMainWnd, SW_SHOWNORMAL);                        SetForegroundWindow((HWND)((ULONG) g_hMainWnd | 0x00000001));                                                SendMessage(g_hMainWnd, WM_REFRESH_TIME, 0, 0);                    }                    break;                }                   case PBT_POWERSTATUSCHANGE:                //DebugOut(TEXT("PWM: PBT_POWERSTATUSCHANGE\r\n"));                break;            case PBT_POWERINFOCHANGE:                {                    PPOWER_BROADCAST_POWER_INFO ppbpi = (PPOWER_BROADCAST_POWER_INFO) pB->SystemPowerState;                    //  RETAILMSG(1, (TEXT("PWM: PBT_POWERINFOCHANGE\r\n")));                    //   RETAILMSG(1, (TEXT("PWM: \tAC line status %u, battery flag %u, backup flag %u, %d levels\r\n"),                    //          ppbpi->bACLineStatus, ppbpi->bBatteryFlag,                     //          ppbpi->bBackupBatteryFlag, ppbpi->dwNumLevels));                    break;                }            default:                //DEBUGMSG(1, (TEXT("PWM: Unknown Message:%d\r\n"), pB->Message));                break;            }        }    }    // We shouldn't be here    if ( g_hPMNotifications )    {        StopPowerNotifications(g_hPMNotifications);        g_hPMNotifications = NULL;    }    if ( g_hPMReadMsgQ )    {        CloseMsgQueue(g_hPMReadMsgQ);        g_hPMReadMsgQ = NULL;    }    DebugOut(_T("ResumeMonThread Exit\r\n"));    return 0;}VOID ReleasePMThread(VOID){    g_FlagExitThrd = TRUE;    if ( g_hPMNotifications )    {        StopPowerNotifications(g_hPMNotifications);        g_hPMNotifications = NULL;    }    if ( g_hPMReadMsgQ )    {        CloseMsgQueue(g_hPMReadMsgQ);        g_hPMReadMsgQ = NULL;    }    return;}
  相关解决方案