添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode . Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).

Dear all,

I am new to PyQt but I developed GUI apps in my past. I want to make a GUI in which a part is refreshed by a Thread. I tried to understand in the internet how it works and I made the following code (see below).

What I do :

  • I create a "worker" class that inherits from QObject. From this worker class I print the threadID ( QThread.currentThreadId() )
  • this worker is instanciated in the window object. It is run through a QThread after a moveToThread operation from the window.
  • The worker sends signals to the window while it loops. The signal itself prints its threadID too
  • I added a timer to the window to display again the threadID in which the window runs.
  • I obtain the same threadID in all the cases and I doubt my worker or my threadID display works well. Can you help ?

    Here comes the code, and then the results.

    Best Regards,

    #!/opt/miniconda3/bin/python3.7
    from PyQt5.QtCore import QObject, QThread, pyqtSignal,QTimer
    from PyQt5.QtWidgets import QApplication,QMainWindow
    from time import sleep
    import sys
    class Worker(QObject):
        finished = pyqtSignal()
        progress = pyqtSignal()
        def run(self):
            """Long-running task."""
            while True:
                sleep(0.5)
                print("in Worker Thread : ", QThread.currentThreadId())
                self.progress.emit()
            self.finished.emit()
    class Window(QMainWindow):
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            self.runLongTask()
        def workerProgress(self):
            print("Report Thread : ",QThread.currentThreadId())
            print("\n")
        def mainAppProgress(self):
            print("Timer Thread : ",QThread.currentThreadId())
        def runLongTask(self):
            # run the worker using a thread
            self.thread = QThread()
            self.worker = Worker()
            self.worker.moveToThread(self.thread)
            self.thread.started.connect(self.worker.run)
            self.worker.progress.connect(self.workerProgress)
            self.thread.start()
            # run a timer to display the window thread too
            self.timer = QTimer()
            self.timer.setInterval(500)
            self.timer.timeout.connect(self.mainAppProgress)
            self.timer.start()
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec())
    

    Results

    Timer Thread :  <sip.voidptr object at 0x10079f0f0>
    in Worker Thread :  <sip.voidptr object at 0x10079f0f0>
    Report Thread :  <sip.voidptr object at 0x10079f0f0>
    Timer Thread :  <sip.voidptr object at 0x10079f0f0>
    in Worker Thread :  <sip.voidptr object at 0x10079f0f0>
    Report Thread :  <sip.voidptr object at 0x10079f0f0>
    Timer Thread :  <sip.voidptr object at 0x10079f0f0>
    in Worker Thread :  <sip.voidptr object at 0x10079f0f0>
    Report Thread :  <sip.voidptr object at 0x10079f0f0>
    Timer Thread :  <sip.voidptr object at 0x10079f0f0>
    in Worker Thread :  <sip.voidptr object at 0x10079f0f0>
    Report Thread :  <sip.voidptr object at 0x10079f0f0>
    Timer Thread :  <sip.voidptr object at 0x10079f0f0>
    in Worker Thread :  <sip.voidptr object at 0x10079f0f0>
    Report Thread :  <sip.voidptr object at 0x10079f0f0>
    Timer Thread :  <sip.voidptr object at 0x10079f0f0>
    in Worker Thread :  <sip.voidptr object at 0x10079f0f0>
    Report Thread :  <sip.voidptr object at 0x10079f120>
    			

    @Mika-L What you are printing is the python object, if you want to get the id of the thread then use int():

    int(QThread.currentThreadId())
    

    Output:

    in Worker Thread :  140448685921856
    Report Thread :  140448915945280
    Timer Thread :  140448915945280
    in Worker Thread :  140448685921856
    Report Thread :  140448915945280
    Timer Thread :  140448915945280
    in Worker Thread :  140448685921856
    Report Thread :  140448915945280
    

    If you want to check if the function is executed in the main thread then compare the QThread.currentThread() with QCoreApplication.instance().thread():

    print("is executed main thread?",  QThread.currentThread() is QCoreApplication.instance().thread())
    

    Another alternative is to use the threading.current_thread() function:

    Timer Thread :  <_MainThread(MainThread, started 140013290776384)>
    in Worker Thread :  <_DummyThread(Dummy-1, started daemon 140013060752960)>
    Report Thread :  <_MainThread(MainThread, started 140013290776384)>
    Timer Thread :  <_MainThread(MainThread, started 140013290776384)>
    in Worker Thread :  <_DummyThread(Dummy-1, started daemon 140013060752960)>
    Report Thread :  <_MainThread(MainThread, started 140013290776384)>
    			

    @eyllanesc : very very nice answer ! thanks a lot ! That really helps !

    I have a last question : is there somewhere a tool to display the CPU consumption for a given thread, cross-platform ? Or a pythonic tool ?

    Thanks again,