久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

<legend id='fUH9Q'><style id='fUH9Q'><dir id='fUH9Q'><q id='fUH9Q'></q></dir></style></legend>

      <i id='fUH9Q'><tr id='fUH9Q'><dt id='fUH9Q'><q id='fUH9Q'><span id='fUH9Q'><b id='fUH9Q'><form id='fUH9Q'><ins id='fUH9Q'></ins><ul id='fUH9Q'></ul><sub id='fUH9Q'></sub></form><legend id='fUH9Q'></legend><bdo id='fUH9Q'><pre id='fUH9Q'><center id='fUH9Q'></center></pre></bdo></b><th id='fUH9Q'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='fUH9Q'><tfoot id='fUH9Q'></tfoot><dl id='fUH9Q'><fieldset id='fUH9Q'></fieldset></dl></div>
    1. <small id='fUH9Q'></small><noframes id='fUH9Q'>

      <tfoot id='fUH9Q'></tfoot>

        <bdo id='fUH9Q'></bdo><ul id='fUH9Q'></ul>

        PyQt5 - QThread:在線程仍在運行時被銷毀

        PyQt5 - QThread: Destroyed while thread is still running(PyQt5 - QThread:在線程仍在運行時被銷毀)
      1. <small id='3F3SG'></small><noframes id='3F3SG'>

      2. <legend id='3F3SG'><style id='3F3SG'><dir id='3F3SG'><q id='3F3SG'></q></dir></style></legend>

            <tbody id='3F3SG'></tbody>

            1. <tfoot id='3F3SG'></tfoot>

              • <bdo id='3F3SG'></bdo><ul id='3F3SG'></ul>
                <i id='3F3SG'><tr id='3F3SG'><dt id='3F3SG'><q id='3F3SG'><span id='3F3SG'><b id='3F3SG'><form id='3F3SG'><ins id='3F3SG'></ins><ul id='3F3SG'></ul><sub id='3F3SG'></sub></form><legend id='3F3SG'></legend><bdo id='3F3SG'><pre id='3F3SG'><center id='3F3SG'></center></pre></bdo></b><th id='3F3SG'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='3F3SG'><tfoot id='3F3SG'></tfoot><dl id='3F3SG'><fieldset id='3F3SG'></fieldset></dl></div>
                  本文介紹了PyQt5 - QThread:在線程仍在運行時被銷毀的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  如果我在線程完成后再次嘗試運行線程,我試圖弄清楚為什么這段代碼會崩潰.

                  I am trying to figure out why this code crashes if I try to run the threads for a second time once they are completed.

                  我第一次單擊開始 5 個線程"時,它運行得很好并完成了.但如果我再次點擊它.整個程序崩潰,我得到 QThread: Destroyed while thread is still running Error

                  The first time I click "Start 5 Threads" It runs just fine and finishes. But if I click it again. The entire program crashes and I get the QThread: Destroyed while thread is still running Error

                  此代碼是在網絡上找到的.我正在努力學習.

                  This code was found on the web. I am trying to learn from it.

                  import time
                  import sys
                  
                  from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot
                  from PyQt5.QtWidgets import QApplication, QPushButton, QTextEdit, QVBoxLayout, QWidget
                  
                  
                  def trap_exc_during_debug(*args):
                      # when app raises uncaught exception, print info
                      print(args)
                  
                  
                  # install exception hook: without this, uncaught exception would cause application to exit
                  sys.excepthook = trap_exc_during_debug
                  
                  
                  class Worker(QObject):
                      """
                      Must derive from QObject in order to emit signals, connect slots to other signals, and operate in a QThread.
                      """
                  
                      sig_step = pyqtSignal(int, str)  # worker id, step description: emitted every step through work() loop
                      sig_done = pyqtSignal(int)  # worker id: emitted at end of work()
                      sig_msg = pyqtSignal(str)  # message to be shown to user
                  
                      def __init__(self, id: int):
                          super().__init__()
                          self.__id = id
                          self.__abort = False
                  
                      @pyqtSlot()
                      def work(self):
                          """
                          Pretend this worker method does work that takes a long time. During this time, the thread's
                          event loop is blocked, except if the application's processEvents() is called: this gives every
                          thread (incl. main) a chance to process events, which in this sample means processing signals
                          received from GUI (such as abort).
                          """
                          thread_name = QThread.currentThread().objectName()
                          thread_id = int(QThread.currentThreadId())  # cast to int() is necessary
                          self.sig_msg.emit('Running worker #{} from thread "{}" (#{})'.format(self.__id, thread_name, thread_id))
                  
                          for step in range(100):
                              time.sleep(0.1)
                              self.sig_step.emit(self.__id, 'step ' + str(step))
                  
                              # check if we need to abort the loop; need to process events to receive signals;
                              app.processEvents()  # this could cause change to self.__abort
                              if self.__abort:
                                  # note that "step" value will not necessarily be same for every thread
                                  self.sig_msg.emit('Worker #{} aborting work at step {}'.format(self.__id, step))
                                  break
                  
                          self.sig_done.emit(self.__id)
                  
                      def abort(self):
                          self.sig_msg.emit('Worker #{} notified to abort'.format(self.__id))
                          self.__abort = True
                  
                  
                  class MyWidget(QWidget):
                      NUM_THREADS = 5
                  
                      # sig_start = pyqtSignal()  # needed only due to PyCharm debugger bug (!)
                      sig_abort_workers = pyqtSignal()
                  
                      def __init__(self):
                          super().__init__()
                  
                          self.setWindowTitle("Thread Example")
                          form_layout = QVBoxLayout()
                          self.setLayout(form_layout)
                          self.resize(400, 800)
                  
                          self.button_start_threads = QPushButton()
                          self.button_start_threads.clicked.connect(self.start_threads)
                          self.button_start_threads.setText("Start {} threads".format(self.NUM_THREADS))
                          form_layout.addWidget(self.button_start_threads)
                  
                          self.button_stop_threads = QPushButton()
                          self.button_stop_threads.clicked.connect(self.abort_workers)
                          self.button_stop_threads.setText("Stop threads")
                          self.button_stop_threads.setDisabled(True)
                          form_layout.addWidget(self.button_stop_threads)
                  
                          self.log = QTextEdit()
                          form_layout.addWidget(self.log)
                  
                          self.progress = QTextEdit()
                          form_layout.addWidget(self.progress)
                  
                          QThread.currentThread().setObjectName('main')  # threads can be named, useful for log output
                          self.__workers_done = None
                          self.__threads = None
                  
                      def start_threads(self):
                          self.log.append('starting {} threads'.format(self.NUM_THREADS))
                          self.button_start_threads.setDisabled(True)
                          self.button_stop_threads.setEnabled(True)
                  
                          self.__workers_done = 0
                          self.__threads = []
                          for idx in range(self.NUM_THREADS):
                              worker = Worker(idx)
                              thread = QThread()
                              thread.setObjectName('thread_' + str(idx))
                              self.__threads.append((thread, worker))  # need to store worker too otherwise will be gc'd
                              worker.moveToThread(thread)
                  
                              # get progress messages from worker:
                              worker.sig_step.connect(self.on_worker_step)
                              worker.sig_done.connect(self.on_worker_done)
                              worker.sig_msg.connect(self.log.append)
                  
                              # control worker:
                              self.sig_abort_workers.connect(worker.abort)
                  
                              # get read to start worker:
                              # self.sig_start.connect(worker.work)  # needed due to PyCharm debugger bug (!); comment out next line
                              thread.started.connect(worker.work)
                              thread.start()  # this will emit 'started' and start thread's event loop
                  
                          # self.sig_start.emit()  # needed due to PyCharm debugger bug (!)
                  
                      @pyqtSlot(int, str)
                      def on_worker_step(self, worker_id: int, data: str):
                          self.log.append('Worker #{}: {}'.format(worker_id, data))
                          self.progress.append('{}: {}'.format(worker_id, data))
                  
                      @pyqtSlot(int)
                      def on_worker_done(self, worker_id):
                          self.log.append('worker #{} done'.format(worker_id))
                          self.progress.append('-- Worker {} DONE'.format(worker_id))
                          self.__workers_done += 1
                          if self.__workers_done == self.NUM_THREADS:
                              self.log.append('No more workers active')
                              self.button_start_threads.setEnabled(True)
                              self.button_stop_threads.setDisabled(True)
                              # self.__threads = None
                  
                      @pyqtSlot()
                      def abort_workers(self):
                          self.sig_abort_workers.emit()
                          self.log.append('Asking each worker to abort')
                          for thread, worker in self.__threads:  # note nice unpacking by Python, avoids indexing
                              thread.quit()  # this will quit **as soon as thread event loop unblocks**
                              thread.wait()  # <- so you need to wait for it to *actually* quit
                  
                          # even though threads have exited, there may still be messages on the main thread's
                          # queue (messages that threads emitted before the abort):
                          self.log.append('All threads exited')
                  
                  
                  if __name__ == "__main__":
                      app = QApplication([])
                  
                      form = MyWidget()
                      form.show()
                  
                      sys.exit(app.exec_())
                  

                  推薦答案

                  通過將他作為父母傳遞給自己來解決問題.你必須改變:

                  The problem is solved by passing him as a parent to self. You must change:

                  thread = QThread()
                  

                  到:

                  thread = QThread(parent=self)
                  

                  這篇關于PyQt5 - QThread:在線程仍在運行時被銷毀的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

                  【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

                  相關文檔推薦

                  How to bind a function to an Action from Qt menubar?(如何將函數綁定到 Qt 菜單欄中的操作?)
                  PyQt progress jumps to 100% after it starts(PyQt 啟動后進度躍升至 100%)
                  How to set yaxis tick label in a fixed position so that when i scroll left or right the yaxis tick label should be visible?(如何將 yaxis 刻度標簽設置在固定位置,以便當我向左或向右滾動時,yaxis 刻度標簽應該可見
                  `QImage` constructor has unknown keyword `data`(`QImage` 構造函數有未知關鍵字 `data`)
                  Change x-axis ticks to custom strings(將 x 軸刻度更改為自定義字符串)
                  How to show progress bar while saving file to excel in python?(如何在python中將文件保存為excel時顯示進度條?)

                  • <tfoot id='NftAb'></tfoot>

                      <bdo id='NftAb'></bdo><ul id='NftAb'></ul>

                      • <i id='NftAb'><tr id='NftAb'><dt id='NftAb'><q id='NftAb'><span id='NftAb'><b id='NftAb'><form id='NftAb'><ins id='NftAb'></ins><ul id='NftAb'></ul><sub id='NftAb'></sub></form><legend id='NftAb'></legend><bdo id='NftAb'><pre id='NftAb'><center id='NftAb'></center></pre></bdo></b><th id='NftAb'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='NftAb'><tfoot id='NftAb'></tfoot><dl id='NftAb'><fieldset id='NftAb'></fieldset></dl></div>
                            <tbody id='NftAb'></tbody>

                            <small id='NftAb'></small><noframes id='NftAb'>

                            <legend id='NftAb'><style id='NftAb'><dir id='NftAb'><q id='NftAb'></q></dir></style></legend>
                          1. 主站蜘蛛池模板: 亚洲国产免费 | 亚洲视频国产视频 | 91精品国产综合久久久动漫日韩 | 狠狠干美女 | 国产精品视频免费 | 欧美99久久精品乱码影视 | 精品九九 | 亚洲国产精品久久久 | 看a网站 | 亚洲视频中文字幕 | 日本精品视频在线观看 | 日韩三 | 成人精品国产一区二区4080 | 国产精品第2页 | 成人亚洲视频 | 国产精品视频久久 | 日韩欧美中文 | 激情欧美日韩一区二区 | 亚洲人久久 | 精品日韩一区 | 国产视频久久久 | 精品国产一区二区三区久久久四川 | 亚洲一区二区三区久久久 | 性一交一乱一伦视频免费观看 | av官网在线 | 91精品国产高清一区二区三区 | 亚洲高清在线观看 | 三级黄视频在线观看 | 午夜精品一区二区三区在线视频 | 免费v片 | 久久精品91 | 成人在线观看中文字幕 | 国产网站在线免费观看 | 99久久精品免费看国产四区 | 久久国产区 | 免费看a| 欧美一级黄色片免费观看 | 欧美日韩国产精品一区 | 成人不卡视频 | 亚洲日本欧美日韩高观看 | www.亚洲视频|