MFC C ++应用程序卡在ProcessShellCommand(CMFCRibbonBar :: RecalcLayout)中

时间:2018-03-19 12:02:29

标签: c++ windows visual-studio mfc freeze

我有一个C ++ MFC SDI应用程序(MGen),它显示在Windows 10上启动和显示GUI之间的暂停时间为10-20秒。我使用MSVS2017性能分析器(CPU使用率)来查找在释放时占用CPU时间的函数建立。此暂停位于ProcessShellCommand内,特别是CMFCRibbonBar::RecalcLayoutCMFCRibbonBar::LoadFromResourceCDockingManager::EnableAutoHidePanes

当某些程序关闭时,暂停似乎被删除或减少。首先我注意到关闭Windows任务管理器固定暂停并再次启动它会返回暂停。然后我发现即使没有任务管理器也会发生暂停。关闭Chrome有助于将暂停时间减少到2-3秒。

我还发现,如果它是由MSVS2017中的MFC向导创建的,那么空项目也存在此问题。

我试过了:

  • 重建解决方案 - 没有帮助
  • 所有发布和调试版本(x86和x64)都存在此问题
  • 在MSVS之外运行,在不同的PC上运行(Windows 10也是如此) - 没有帮助
  • 重新启动Windows似乎暂时解决了这个问题(暂停消失)。
  • 我在CMainFrame :: OnCreate()中注释掉了OnApplicationLook()调用。暂停仍然存在,因为现在从其他地方调用这些函数:Image1 Image2

可以在GitHub上找到代码:

    BOOL CMGenApp::InitInstance()
    {
        // InitCommonControlsEx() is required on Windows XP if an application
        // manifest specifies use of ComCtl32.dll version 6 or later to enable
        // visual styles.  Otherwise, any window creation will fail.
        INITCOMMONCONTROLSEX InitCtrls;
        InitCtrls.dwSize = sizeof(InitCtrls);
        // Set this to include all the common control classes you want to use
        // in your application.
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
        InitCommonControlsEx(&InitCtrls);

        CWinAppEx::InitInstance();

        // Initialize OLE libraries
        if (!AfxOleInit())
        {
            AfxMessageBox(IDP_OLE_INIT_FAILED);
            return FALSE;
        }

        AfxEnableControlContainer();

        EnableTaskbarInteraction(FALSE);

        // Initialize GDI+
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

        SetRegistryKey(_T("MGen"));
        LoadStdProfileSettings(10);  // Load standard INI file options (including MRU)

        InitContextMenuManager();

        InitKeyboardManager();

        InitTooltipManager();
        CMFCToolTipInfo ttParams;
        ttParams.m_bVislManagerTheme = TRUE;
        theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
            RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);

        // Register the application's document templates.  Document templates
        //  serve as the connection between documents, frame windows and views
        CSingleDocTemplate* pDocTemplate;
        pDocTemplate = new CSingleDocTemplate(
            IDR_MAINFRAME,
            RUNTIME_CLASS(CMGenDoc),
            RUNTIME_CLASS(CMainFrame),       // main SDI frame window
            RUNTIME_CLASS(CMGenView));
        AddDocTemplate(pDocTemplate);

        // Parse command line for standard shell commands, DDE, file open
        CCommandLineInfo cmdInfo;

        // Enable DDE Execute open
        EnableShellOpen();

        // Dispatch commands specified on the command line.  Will return FALSE if
        // app was launched with /RegServer, /Register, /Unregserver or /Unregister.
        if (!ProcessShellCommand(cmdInfo))
            return FALSE;

        // The one and only window has been initialized, so show and update it
        m_pMainWnd->ShowWindow(SW_SHOW);
        m_pMainWnd->UpdateWindow();
        // call DragAcceptFiles only if there's a suffix
        //  In an SDI app, this should occur after ProcessShellCommand
        // Enable drag/drop open
        m_pMainWnd->DragAcceptFiles();
        return TRUE;
    }

P.S。我在两台PC中使用最新组件(Intel I7-8700K配64Gb RAM和Intel I7-4770K配备32 Gb RAM,SSD)并且不会出现性能问题。在应用程序启动暂停期间,CPU仅由应用程序使用。

详细的效果分析结果: Performance profiler1 Performance profiler2

更详细的分析: Performance profiler3

ExitInstance中也存在同样的问题: Performance profiler4

1 个答案:

答案 0 :(得分:0)

此问题是Microsoft中的一个已知问题。 Windows更新修复了该问题。因此,要修复此问题,您需要更新Windows 10。