I've encountered a bug of mine, that is leading me to ask how to properly fix
some behavior...
The setup: I've got a worker task that runs in a separate thread, waiting for
jobs to come over from MainWindow. When that worker task gets a job, it splits
the jobs into smaller chunks, and then uses QtConcurrent::map() to process
those chunks in parallel. Currently I've got a bug in my processChunk()
function which is causing an infinite loop (I'm fixing that as we speak), but
what I noticed is that because of those infinite loops running inside of
QtConcurrent calls, I was unable to quit my application. Since all the infinite
loop is happening in a non-UI thread, the UI is responsive and I can choose to
quit the application from either the File menu or the 'X' button. The UI goes
away, but the application is still running, and there's no way to do anything
about it other than killing it out at the OS task manager level. What I want to
have happen is any processing that is in process when the user quits is
immediately aborted/terminated and the application exits cleanly.
So basically I have:
- a thread, workerThread
- an object, workerObject, that lives in workerThread
- a function, workerObject::processChunk()
- this function is the one that currently has an infinite loop bug
- a future watcher, chunkWatcher
And then when workerObject receives a new request signal from MainWindow, it
calls
chunkWatcher->setFuture(QtConcurrent::map(chunks, processChunk));
In MainWindow, I've got this:
~MainWindow()
{
mWorkerThread->terminate();
mWorkerThread ->wait();
}
But that code only kills the thread the worker task itself is in, not the
threads that QtConcurrent has spawned off to run processChunk() that will never
return. I'm poking through the QFutureWatcher, but I don't see a way to
forcefully terminate stuff that's in progress. All I see is cancel() and
pause(), but if I understand what I'm seeing, those don't seem to stop
processChunk() calls that are already in progress, they just prevent
processChunk() from being called on the remaining chunks after each chunk in
progress finished.
So is there any way I can terminate QtConcurrent::map()?
Sean
This e-mail, including any attached files, may contain confidential
information, privileged information and/or trade secrets for the sole use of
the intended recipient. Any review, use, distribution, or disclosure by others
is strictly prohibited. If you are not the intended recipient (or authorized to
receive information for the intended recipient), please contact the sender by
reply e-mail and delete all copies of this message.
_______________________________________________
Interest mailing list
[email protected]
https://lists.qt-project.org/listinfo/interest