[Interest] QThreadPool functionality for QThreads

Elvis Stansvik elvstone at gmail.com
Wed Jan 18 20:04:41 CET 2017


2017-01-18 8:17 GMT+01:00 Frank Rueter | OHUfx <frank at ohufx.com>:
> Hi Thiago,
>
> thanks for your quick reply. I will try and give some more context:
> I use the python requests module inside my PySide app to post requests to a
> website. Some of those requests return a lot of data that I need to parse to
> be able to show progress, other requests are file downloads that I need
> progress bars for as they stream onto disk.
> I had tried to not use threads and use QApplication.processEvents() for each
> data chunk downloaded, but that made the download about 4-5 times slower.
> Introducing threading made a huge difference.

Right, you won't get a good result with that approach. It's always
good to be up front with any special circumstances like this (using a
networking API that does not run on top of the Qt event loop).

>
> My app can download a list of files at the same time. Depending on the
> situation and the user request, the list of files to be downloaded can
> happen asynchronously, in other situations they need to be downloaded one
> after the other.

I think this is what confused Thiago: What you mean is sequential (as
opposed to parallell), not synchronous.

If you have one QThread that depends on the completion of another,
then no, I don't think there's a convenient API in Qt to express that
relationship and run the threads in sequence. You'll have to string
them together yourself, or maybe use something else like Threadweaver.
I could be wrong of course :)

Elvis

>
>>>All I can tell you is that you don't need to do what you're trying to do,
>>> since you don't need threads in the first place.
> If I can avoid threads to do the above I would be more than happy to adjust
> and get rid of them again, but I haven't managed to find a non-threaded
> approach that doesn't slow down the download significantly.
>
> Cheers,
> frank
>
>
> On 18/01/17 6:26 PM, Thiago Macieira wrote:
>>
>> On quarta-feira, 18 de janeiro de 2017 17:21:46 PST Frank Rueter | OHUfx
>> wrote:
>>>
>>> Hi,
>>>
>>> I got another threading question for the pros out there:
>>>
>>> In  my current application I am using QThread objects and
>>> QObject.moveToThread() to enable my GUI to download multiple files while
>>> updating progress bars in the main event loop. This is the respective
>>
>> As usual, the usual disclaimer: you do not need threads to do networking
>> or
>> file I/O. The combined overhead of the networking I/O and saving of the
>> files is
>> unlikely to overwhelm the event loop to the point that the progress bar
>> can't
>> update smoothly.
>>
>> I'm not saying impossible, but it's unlikely.
>>
>>> snippet of code:
>>>           self.worker = MyClass()
>>>           self.workerThread = QtCore.QThread()
>>>           self.worker.moveToThread(self.workerThread)
>>>
>>> The trouble is when the user wants to download multiple files at once.
>>> In my current implementation that all works fine and I see multiple
>>> progress bars do there thing.
>>> However, there are cases when I need to force the download threads to be
>>> synchronous. I had hoped that I can use QThreadPool with QThreads, but
>>> turns out I need QRunnables in this case, and those don't have the same
>>> signals as QThread.
>>
>> Why do you need to force them to be synchronous? And synchronous with
>> what?
>> With each other? Or do you mean sync() in the file saving?
>>
>> Finally, what does being synchronous have to do with signals?
>>
>>> So my question is:
>>> Is there a good way to use QThreads in a queue which is controlled by
>>> the main thread, or should I re-write my code and subclass QRunnable to
>>> add the signals I need (i.e. the ones that QThread has by default)?
>>
>> The whole point of QThread is that the code it runs is independent of
>> anything
>> else. Only the OS scheduler decides when it's time to run it or suspend
>> it.
>>
>>> In the latter case I guess I'd have to inherit from both QObject and
>>> QRunnable, is this ok?
>>
>> Right.
>>
>> But we still don't understand what you're trying to do. All I can tell you
>> is
>> that you don't need to do what you're trying to do, since you don't need
>> threads in the first place.
>>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest



More information about the Interest mailing list