Index: kdevplatform/shell/projectcontroller.cpp =================================================================== --- kdevplatform/shell/projectcontroller.cpp +++ kdevplatform/shell/projectcontroller.cpp @@ -107,6 +107,7 @@ bool m_cleaningUp; //Temporary flag enabled while destroying the project-controller QPointer m_changesModel; QHash< IProject*, QPointer > m_parseJobs; // parse jobs that add files from the project to the background parser. + QList m_pendingParseProjectJobs; // project parse jobs waiting to be started explicit ProjectControllerPrivate( ProjectController* p ) : m_core(nullptr), model(nullptr), dialog(nullptr), q(p), buildset(nullptr), m_foundProjectFile(false), m_cleaningUp(false) @@ -897,7 +898,18 @@ d->m_currentlyOpening.removeAll(project->projectFile().toUrl()); emit projectOpened( project ); - reparseProject(project); + // don't call reparseProject immediately, defer until all currently opening + // projects have been imported. Parsing is done in the background but + // importing can block the UI so should be as fast as possible. + if (d->m_currentlyOpening.isEmpty()) { + reparseProject(project); + foreach (const auto p, d->m_pendingParseProjectJobs) { + reparseProject(p); + } + d->m_pendingParseProjectJobs.clear(); + } else { + d->m_pendingParseProjectJobs.append(project); + } } // helper method for closeProject()