[Interest] Reset QThread requestedInterruption()

Pérais Kévin vinorcola at hotmail.fr
Sun Jul 27 13:22:03 CEST 2014


Hi all,

I wanted to discuss further about a suggestion a made in the bug tracker 
few days ago:
https://bugreports.qt-project.org/browse/QTBUG-40400

The topic is about the possibility to reset the interruption requested 
of a thread.
Thiago Macieira told me that the functionality was implemented in order 
to stop the job. However, I disagree with that. Maybe the feature was 
thought only for that, but the Qt Documentation say about it:

http://qt-project.org/doc/qt-5/qthread.html#requestInterruption
" That request is advisory and it is up to code running on the thread to 
decide if and how it should act upon such request. This function does 
not stop any event loop running on the thread and does not terminate it 
in any way."

I first notice the "it is up to code running on the thread to decide IF 
and HOW it should act"
I then "This function does not stop any event loop running on the thread 
and does not terminate it in any way."

So I don't see why this functionality should be only used in order to 
stop a thread running, and could be not be used to stop a JOB running in 
the thread (but not the thread itself).

Let me explain a more concrete example of thread I am doing:

I have 3 worker objects that are meant to run in separate threads.

The first thread A have to read a file line by line and make few checks. 
It then pushes the QString to a queued shared buffer with thread B.
Thread B take those results and parse the QString into a QStringList. It 
pushes the QStringList in a queued shared buffer with thread C.
Thread C binds the QStringList parameters in a prepared SQL statement 
and execute it.

An object in my main thread manages the worker threads synchronisation. 
It setup the worker objects, create QThread instances, move the objects 
to the correct thread and launch those threads. When the user click on a 
button, It calls a method in the object Manager than manage to launch 
the differents methods in the worker threads using SIGNAL with 
parameters (since it is thread-safe).

If an error occurred in any of the worker threads, the concern thread 
send an error SIGNAL to the object Manager and stop his job (return in a 
method). Then the object Manager executes requestInterruption() to other 
worker thread so they stop their job too. At this stage, the user can 
correct the input data and launch again the whole work.

So he clicks again on the button. The object Manager send SIGNAL to all 
thread so they start working again with new data. The problem now is 
that 2 of the 3 threads will have the isInterruptionRequested() method 
returning TRUE, so they will stop has they believe an error occurred in 
an other thread. And then, I end up to a blocked situation where 2 
threads ended their job, and the last one is waiting because the queued 
shared buffer are empty and it doesn't receive interruptionRequest() -- 
because no error SIGNAL have been sent to the object Manager since there 
was no errors.

So maybe my design is wrong. It's quite the first time I use threads. 
But having a method that can reset the requested interruption would have 
help me a lot!

I join you the forum discussion where I posted:
http://qt-project.org/forums/viewthread/44348/

Thank you for your participation.
Vinorcola.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20140727/ab220dbe/attachment.html>


More information about the Interest mailing list