3939ThreadHandler::ThreadHandler (QObject *parent) :
4040 QObject(parent)
4141{
42- setThreadCount (1 );
4342}
4443
4544ThreadHandler::~ThreadHandler ()
@@ -54,7 +53,7 @@ void ThreadHandler::clearFiles()
5453 mAnalyseWholeProgram = false ;
5554 mCtuInfo .clear ();
5655 mAddonsAndTools .clear ();
57- mSuppressions .clear ();
56+ mSuppressionsUI .clear ();
5857}
5958
6059void ThreadHandler::setFiles (const QStringList &files)
@@ -83,6 +82,14 @@ void ThreadHandler::setCheckFiles(const QStringList& files)
8382 }
8483}
8584
85+ void ThreadHandler::setupCheckThread (CheckThread &thread) const
86+ {
87+ thread.setAddonsAndTools (mCheckAddonsAndTools );
88+ thread.setSuppressions (mSuppressionsUI );
89+ thread.setClangIncludePaths (mClangIncludePaths );
90+ thread.setSettings (mCheckSettings , mCheckSuppressions );
91+ }
92+
8693void ThreadHandler::check (const Settings &settings, const std::shared_ptr<Suppressions>& supprs)
8794{
8895 if (mResults .getFileCount () == 0 || mRunningThreadCount > 0 || settings.jobs == 0 ) {
@@ -91,25 +98,25 @@ void ThreadHandler::check(const Settings &settings, const std::shared_ptr<Suppre
9198 return ;
9299 }
93100
94- setThreadCount (settings.jobs );
101+ mCheckSettings = settings;
102+ mCheckSuppressions = supprs;
103+
104+ createThreads (mCheckSettings .jobs );
95105
96106 mRunningThreadCount = mThreads .size ();
97107 mRunningThreadCount = std::min (mResults .getFileCount (), mRunningThreadCount );
98108
99- QStringList addonsAndTools = mAddonsAndTools ;
100- for (const std::string& addon: settings .addons ) {
109+ mCheckAddonsAndTools = mAddonsAndTools ;
110+ for (const std::string& addon: mCheckSettings .addons ) {
101111 QString s = QString::fromStdString (addon);
102- if (!addonsAndTools .contains (s))
103- addonsAndTools << s;
112+ if (!mCheckAddonsAndTools .contains (s))
113+ mCheckAddonsAndTools << s;
104114 }
105115
106116 mCtuInfo .clear ();
107117
108118 for (int i = 0 ; i < mRunningThreadCount ; i++) {
109- mThreads [i]->setAddonsAndTools (addonsAndTools);
110- mThreads [i]->setSuppressions (mSuppressions );
111- mThreads [i]->setClangIncludePaths (mClangIncludePaths );
112- mThreads [i]->setSettings (settings, supprs);
119+ setupCheckThread (*mThreads [i]);
113120 mThreads [i]->start ();
114121 }
115122
@@ -123,14 +130,12 @@ void ThreadHandler::check(const Settings &settings, const std::shared_ptr<Suppre
123130
124131bool ThreadHandler::isChecking () const
125132{
126- return mRunningThreadCount > 0 ;
133+ return mRunningThreadCount > 0 || mAnalyseWholeProgram ;
127134}
128135
129- void ThreadHandler::setThreadCount (const int count)
136+ void ThreadHandler::createThreads (const int count)
130137{
131- if (mRunningThreadCount > 0 ||
132- count == mThreads .size () ||
133- count <= 0 ) {
138+ if (mRunningThreadCount > 0 || count <= 0 ) {
134139 return ;
135140 }
136141
@@ -140,9 +145,9 @@ void ThreadHandler::setThreadCount(const int count)
140145 for (int i = mThreads .size (); i < count; i++) {
141146 mThreads << new CheckThread (mResults );
142147 connect (mThreads .last (), &CheckThread::done,
143- this , &ThreadHandler::threadDone);
148+ this , &ThreadHandler::threadDone, Qt::QueuedConnection );
144149 connect (mThreads .last (), &CheckThread::fileChecked,
145- &mResults , &ThreadResult::fileChecked);
150+ &mResults , &ThreadResult::fileChecked, Qt::QueuedConnection );
146151 }
147152}
148153
@@ -151,7 +156,7 @@ void ThreadHandler::removeThreads()
151156{
152157 for (CheckThread* thread : mThreads ) {
153158 if (thread->isRunning ()) {
154- thread->terminate ();
159+ thread->stop ();
155160 thread->wait ();
156161 }
157162 disconnect (thread, &CheckThread::done,
@@ -162,19 +167,22 @@ void ThreadHandler::removeThreads()
162167 }
163168
164169 mThreads .clear ();
165- mAnalyseWholeProgram = false ;
166170}
167171
168172void ThreadHandler::threadDone ()
169173{
170- if (mRunningThreadCount == 1 && mAnalyseWholeProgram ) {
174+ mRunningThreadCount --;
175+
176+ if (mRunningThreadCount == 0 && mAnalyseWholeProgram ) {
177+ createThreads (1 );
178+ mRunningThreadCount = 1 ;
179+ setupCheckThread (*mThreads [0 ]);
171180 mThreads [0 ]->analyseWholeProgram (mLastFiles , mCtuInfo );
172181 mAnalyseWholeProgram = false ;
173182 mCtuInfo .clear ();
174183 return ;
175184 }
176185
177- mRunningThreadCount --;
178186 if (mRunningThreadCount == 0 ) {
179187 emit done ();
180188
@@ -185,6 +193,9 @@ void ThreadHandler::threadDone()
185193 mLastCheckTime = mCheckStartTime ;
186194 mCheckStartTime = QDateTime ();
187195 }
196+
197+ mCheckAddonsAndTools .clear ();
198+ mCheckSuppressions .reset ();
188199 }
189200}
190201
@@ -215,7 +226,7 @@ void ThreadHandler::initialize(const ResultsView *view)
215226
216227void ThreadHandler::loadSettings (const QSettings &settings)
217228{
218- setThreadCount (settings.value (SETTINGS_CHECK_THREADS, 1 ).toInt ());
229+ createThreads (settings.value (SETTINGS_CHECK_THREADS, 1 ).toInt ());
219230}
220231
221232void ThreadHandler::saveSettings (QSettings &settings) const
0 commit comments