//**関数*************************************************************************** // 概要 : デフォルトのメッセージ ループ //********************************************************************************* int CWindow::Run() { if (!InitInstance()) return ExitInstance(); bool bIdle = TRUE; long lIdleCount = 0; for (;;) { while (bIdle && !::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) { if (!OnIdle(lIdleCount++)) bIdle = false; } do { if (!PumpMessage()) return ExitInstance(); if (IsIdleMessage(&m_msgCur)) { bIdle = true; lIdleCount = 0; } } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)); } return -1; // ここには来ないはず。 }
void CServerSession::RunSession( SOCKET sock ) { char buf[MAXCMDBUF]; CNcpMessage* pMsg = (CNcpMessage*)buf; //initialize the state and socket. ASSERT( m_sock==0 ); m_sock = sock; m_state = NCPS_CLOSED; while( true ) { pMsg->Recv( m_sock, ELEMENTS(buf) ); if( m_state==NCPS_CLOSED ) { if( pMsg->GetCmd()!=CM_LOGON ) { pMsg->Init( CM_ACK ); pMsg->SetRet( E_UNKNOWN ); pMsg->Send( m_sock ); continue; } } PumpMessage( pMsg, ELEMENTS(buf) ); if( m_state==NCPS_CLOSED )break; } }
int CWinThread::Run() /*******************/ { MSG msg; LONG lCount = 0L; for( ;; ) { while( !::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) { if( OnIdle( lCount ) ) { lCount++; } else { ::WaitMessage(); } } if( !PumpMessage() ) { break; } if( IsIdleMessage( &msg ) ) { if( OnIdle( lCount ) ) { lCount++; } else { ::WaitMessage(); } } else { lCount = 0L; } } return( ExitInstance() ); }
int CRadiantApp::Run( void ) { BOOL bIdle = TRUE; LONG lIdleCount = 0; #if _MSC_VER >= 1300 MSG *msg = AfxGetCurrentMessage(); // TODO Robert fix me!! #else MSG *msg = &m_msgCur; #endif // phase1: check to see if we can do idle work while( bIdle && !::PeekMessage( msg, NULL, NULL, NULL, PM_NOREMOVE ) ) { // call OnIdle while in bIdle state if( !OnIdle( lIdleCount++ ) ) { bIdle = FALSE; // assume "no idle" state } } // phase2: pump messages while available do { // pump message, but quit on WM_QUIT if( !PumpMessage() ) { return ExitInstance(); } // reset "no idle" state after pumping "normal" message if( IsIdleMessage( msg ) ) { bIdle = TRUE; lIdleCount = 0; } } while( ::PeekMessage( msg, NULL, NULL, NULL, PM_NOREMOVE ) ); return 0; }
int CWinThread::RunLoop() { bool bIdle = true; LONG lIdleCount = 0; _AFX_THREAD_STATE* pState = AfxGetThreadState(); while (true) { #if UCFG_GUI while (bIdle && !::PeekMessage(&(pState->m_msgCur), 0, 0, 0, PM_NOREMOVE)) bIdle = OnIdle(lIdleCount++); #endif do { //#ifndef NO_GUI //!!! if (!PumpMessage()) return ExitInstance(); //#endif if (IsIdleMessage(pState->m_msgCur)) { bIdle = true; lIdleCount = 0; } } while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE)); } }
int CPlayerMgr::Run() { // TODO: 在此添加专用代码和/或调用基类 ASSERT_VALID(this); #ifndef _AFXDLL #define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE #define _afxSockThreadState AfxGetModuleThreadState() _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState; if (pState->m_pmapSocketHandle == NULL) pState->m_pmapSocketHandle = new CMapPtrToPtr; if (pState->m_pmapDeadSockets == NULL) pState->m_pmapDeadSockets = new CMapPtrToPtr; if (pState->m_plistSocketNotifications == NULL) pState->m_plistSocketNotifications = new CPtrList; #endif if (!m_skListen.Socket(SOCK_STREAM, FD_ACCEPT)) return false; srand(time(NULL)); WORD nListenPort; while(true) { #ifdef _DEBUG nListenPort = 8880; #else nListenPort = 3000 + rand() % 1200; #endif if(m_skListen.Bind(nListenPort)) break; else { TRACE("bind error: %d\n", WSAGetLastError()); } } m_nListenPort = nListenPort; m_skListen.Listen(5); _AFX_THREAD_STATE* pTState = AfxGetThreadState(); while(true) { Process(); if(::PeekMessage(&(pTState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE)) { if (!PumpMessage()) return ExitInstance(); } } return 0; }
void CProtectedWinThread::PumpMessages() { ASSERT_VALID(this); // for tracking the idle time state BOOL bIdle = TRUE; LONG lIdleCount = 0; #if _MFC_VER >= 0x0710 _AFX_THREAD_STATE* pState = AfxGetThreadState(); MSG &msgCur = pState->m_msgCur; #else MSG &msgCur = m_msgCur; #endif /* _MFC_VER_ */ // acquire and dispatch messages until a WM_QUIT message is received. for (;;) { // phase1: check to see if we can do idle work while (bIdle && !::PeekMessage(&msgCur, NULL, NULL, NULL, PM_NOREMOVE)) { // call OnIdle while in bIdle state if (!OnIdle(lIdleCount++)) bIdle = FALSE; // assume "no idle" state } // phase2: pump messages while available do { // pump message, but quit on WM_QUIT if (!PumpMessage()) { #if defined(_DEBUG) # if _MFC_VER < 0x0710 m_nDisablePumpCount--; // application must NOT die # else pState->m_nDisablePumpCount--; // application must NOT die # endif #endif return; } // reset "no idle" state after pumping "normal" message if (IsIdleMessage(&msgCur)) { bIdle = TRUE; lIdleCount = 0; } } while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_NOREMOVE)); } ASSERT(FALSE); // not reachable }
//-------------------------------------------------------------------// // PurgeMessages() // //-------------------------------------------------------------------// // Used by processor intensive tasks to allow messages to // be processed once in a while. This will allow for // button presses on modeless dialogs & paint refreshes. //-------------------------------------------------------------------// void BaseApp::PurgeMessages() { MSG msg; while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) { if ( !PumpMessage() ) { ::PostQuitMessage( 0 ); break; } } }
// override the Run so we can put an exception handler aaround the message loop (pre-translate causes some grief) int CPageTestExeApp::Run() { // acquire and dispatch messages until a WM_QUIT message is received. for(;;) { __try { // pump message, but quit on WM_QUIT if (!PumpMessage()) return ExitInstance(); } __except(1) { } } }
void InformApp::RunMessagePump(void) { LONG count = 0; while (OnIdle(count++)); MSG msg; while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if (msg.message == WM_COMMAND) ::PeekMessage(&msg,NULL,0,0,PM_REMOVE); else if (PumpMessage() == FALSE) exit(ExitInstance()); } if (IsWaitCursor()) RestoreWaitCursor(); }
void CXTPShortcutBarPopup::DoModal() { int nClassStyle = 0; if (XTPSystemVersion()->IsWinXPOrGreater()) nClassStyle |= 0x00020000; CreateEx(WS_EX_TOOLWINDOW, AfxRegisterWndClass(nClassStyle, AfxGetApp()->LoadStandardCursor(IDC_ARROW)), 0, MFS_SYNCACTIVE | WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CRect(0, 0, 0, 0), m_pShortcutBar, 0); CXTPWindowRect rcShortcutBar(m_pShortcutBar); CRect rc(rcShortcutBar.right, rcShortcutBar.top, rcShortcutBar.right + m_nPopupWidth + FRAME_GAP + FRAME_GAP, rcShortcutBar.bottom); SetWindowPos(0, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER | SWP_SHOWWINDOW); ::SetParent(m_hWndChild, m_hWnd); ::SetWindowPos(m_hWndChild, 0, FRAME_GAP, FRAME_GAP, rc.Width() - FRAME_GAP - FRAME_GAP, rc.Height() - FRAME_GAP - FRAME_GAP, SWP_NOZORDER | SWP_SHOWWINDOW); ::SetFocus(m_hWndChild); PumpMessage(); if (m_hWndChild) { ::SetParent(m_hWndChild, m_pShortcutBar->GetSafeHwnd()); ::ShowWindow(m_hWndChild, SW_HIDE); m_hWndChild = NULL; } m_nPopupWidth = CXTPWindowRect(this).Width() - FRAME_GAP - FRAME_GAP; DestroyWindow(); }
extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR pCmdLine, int nCmdShow) { Shortcut_Init(); TaLocale_LoadCorrespondingModule (hInst); osi_InitTraceOption(); osi_LogEvent0("AFSCreds Main command line",pCmdLine); fs_utils_InitMountRoot(); if (InitApp (pCmdLine)) { MSG msg; while (GetMessage (&msg, NULL, 0, 0) > 0) { PumpMessage (&msg); } ExitApp(); } Shortcut_Exit(); return 0; }
BOOL CMFCBounceBallApp::InitInstance() { // 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을 // 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다. // InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다. INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록 // 이 항목을 설정하십시오. InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinAppEx::InitInstance(); // OLE 라이브러리를 초기화합니다. if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); // 표준 초기화 // 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면 // 아래에서 필요 없는 특정 초기화 // 루틴을 제거해야 합니다. // 해당 설정이 저장된 레지스트리 키를 변경하십시오. // TODO: 이 문자열을 회사 또는 조직의 이름과 같은 // 적절한 내용으로 수정해야 합니다. SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램")); InitContextMenuManager(); InitKeyboardManager(); InitTooltipManager(); CMFCToolTipInfo ttParams; ttParams.m_bVislManagerTheme = TRUE; theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL, RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams); // 주 창을 만들기 위해 이 코드에서는 새 프레임 창 개체를 // 만든 다음 이를 응용 프로그램의 주 창 개체로 설정합니다. CMainFrame* pFrame = new CMainFrame; if (!pFrame) return FALSE; m_pMainWnd = pFrame; // 프레임을 만들어 리소스와 함께 로드합니다. pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); // 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다. pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); // 접미사가 있을 경우에만 DragAcceptFiles를 호출합니다. // SDI 응용 프로그램에서는 ProcessShellCommand 후에 이러한 호출이 발생해야 합니다. int oldT = GetTickCount(); bool bDoingBackgroundProcessing = true; while ( bDoingBackgroundProcessing ) { MSG msg; while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) { if ( !PumpMessage( ) ) { bDoingBackgroundProcessing = FALSE; ::PostQuitMessage(0); break; } } // let MFC do its idle processing LONG lIdle = 0; while ( AfxGetApp()->OnIdle(lIdle++ ) ) ; if (bDoingBackgroundProcessing) { Sleep(0); const int curT = GetTickCount(); int elapse = curT - oldT; if (elapse > 1000) elapse = 0; pFrame->GetChildView()->MainLoop(elapse); oldT = curT; } } return TRUE; }