[Interest] QThreadPool functionality for QThreads

Elvis Stansvik elvstone at gmail.com
Wed Jan 18 20:11:35 CET 2017


2017-01-18 20:04 GMT+01:00 Elvis Stansvik <elvstone at gmail.com>:
> 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 infrom sequence. You'll have to string
> them together yourself, or maybe use something else like Threadweaver.
> I could be wrong of course :)

Another approach is of course to ditch the threading and use the
asyncronous QNetworkAccessManager from Qt, instead of using the Python
requests module. You can use the downloadProgress/uploadProgress of
the QNetworkReply you get from get(..) or post(..) if you want to show
progress (haven't used it myself).

Elvis

>
> 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