我有一个C ++ MFC SDI应用程序(MGen),它显示在Windows 10上启动和显示GUI之间的暂停时间为10-20秒。我使用MSVS2017性能分析器(CPU使用率)来查找在释放时占用CPU时间的函数建立。此暂停位于ProcessShellCommand
内,特别是CMFCRibbonBar::RecalcLayout
,CMFCRibbonBar::LoadFromResource
,CDockingManager::EnableAutoHidePanes
。
当某些程序关闭时,暂停似乎被删除或减少。首先我注意到关闭Windows任务管理器固定暂停并再次启动它会返回暂停。然后我发现即使没有任务管理器也会发生暂停。关闭Chrome有助于将暂停时间减少到2-3秒。
我还发现,如果它是由MSVS2017中的MFC向导创建的,那么空项目也存在此问题。
我试过了:
可以在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仅由应用程序使用。
详细的效果分析结果:
更详细的分析:
ExitInstance中也存在同样的问题:
答案 0 :(得分:0)
此问题是Microsoft中的一个已知问题。 Windows更新修复了该问题。因此,要修复此问题,您需要更新Windows 10。