2017-01-18 8:17 GMT+01:00 Frank Rueter | OHUfx <fr...@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@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest