2017-01-18 20:04 GMT+01:00 Elvis Stansvik <elvst...@gmail.com>: > 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 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@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