[Interest] Threading Question
Tony Rietwyk
tony at rightsoft.com.au
Thu Oct 9 07:17:01 CEST 2014
Hi Jason,
Are you calling QApplication.exec in your main thread? In not, I don't
think the slots there will be activated.
Regards,
Tony
> -----Original Message-----
> From: interest-bounces+tony=rightsoft.com.au at qt-project.org
> [mailto:interest-bounces+tony=rightsoft.com.au at qt-project.org] On Behalf
> Of Jason Kretzer
> Sent: Thursday, 9 October 2014 2:43 PM
> To: interest at qt-project.org
> Subject: [Interest] Threading Question
>
> I am a bit confused on threading.
>
> Lets say I have Thread A - which is where the program is started - has
> main(), etc.
>
> Inside of main() I instantiate a class called BackgroundClass and I move
it to
> another thread (Thread B).
> BackgroundClass::init();
> QThread *thread = new QThread();
> BackgroundClass::instance()->moveToThread(thread);
> thread->start();
>
> Inside of BackgroundClass in the constructor, I start a QTimer that is
> supposed to go off every 5minutes and call the runTasks function when it
> does.
> QTimer* timer = new QTimer(this);
> connect(timer, SIGNAL(timeout()), this, SLOT(runTasks()));
> timer->start(FIVE_MINS);
>
> I put a qDebug in the runTasks function to ensure that it is a different
thread
> than the main thread (Thread A).
> qDebug() << "Running tasks... -- Thread ID: " <<
QThread::currentThreadId();
> //inside runTasks
>
> This always shows a different ID than the main thread.
>
>
> Back in the main thread (Thread A), I instantiate another class AFTER the
> BackgroundClass instantiation.
>
> WorkManager::init();
>
> this is not moved to a separate thread so, I assume it stays in Thread A.
>
> In the constructor of WorkManager, I connect Signals from BackgroundClass
> to Slots in WorkManager like so.
>
> connect(BackgroundTaskManager::instance(), SIGNAL(someSignal()),
> instance(), SLOT(restartWorker()));
>
> When the BackgroundClass finishes a task, it emits the someSignal.
>
> >From what I can tell, as soon as the someSignal is emitted, the
> restartWorker slot is called and the rest of the code that is immediately
after
> that does not execute. For example, above, the runTasks function is
> supposed to run several tasks in a while loop. To make sure this loop is
> thread safe, so it can be the only thing running those tasks I put a mutex
> around the while loop. At the end of the runTask function, the someSignal
is
> emitted the result is set, and then it is returned.
>
> if (!mutex.tryLock()) {
> qDebug() << "Previous instance of RunTasks still running...";
> return;
> }
> while(moreTasks) {
> bool result = runTask(t);
>
> updateDatabase(t, result);
> }
> mutex.unlock();
>
>
> Unforturnately, the runTask method never returns, it appears that the
> restartWorker is called immediately upon someSignal being emitted.
>
> So, I say all that to ask, why does the rest of the code not execute?
> Obviously, I am doing something wrong, but I am not sure where the flaw
is.
> Would anyone be so kind as to point me in the right direction?
>
> Thanks!
>
> -Jason
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
More information about the Interest
mailing list