MyException - 我的异常网
输入您需解决的 软件开发问题并开始搜索, 我的异常网可以方便地提供各类 程序错误解决方案。
当前位置: 我的异常网 » Windows Mobile

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

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;
}
				
软件开发 程序错误 异常 Exception Copyright © 2009-2012 MyException 版权所有