Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyqt-Can';不让单独的线程同时运行吗?_Python_Multithreading_Pyqt - Fatal编程技术网

Python 使用pyqt-Can';不让单独的线程同时运行吗?

Python 使用pyqt-Can';不让单独的线程同时运行吗?,python,multithreading,pyqt,Python,Multithreading,Pyqt,我正在尝试让PyQT GUI在python应用程序的ontop上运行,并且我已经尝试将其分为两个线程,以便GUI在我的主运行循环运行时能够响应,但我一直无法让它运行。也许我误解了。以下是我尝试过的: 我的窗口和工作者线程定义如下: class Window(QWidget): def __init__(self, parent = None): QWidget.__init__(self, parent) self.thread = Worker()

我正在尝试让PyQT GUI在python应用程序的ontop上运行,并且我已经尝试将其分为两个线程,以便GUI在我的主运行循环运行时能够响应,但我一直无法让它运行。也许我误解了。以下是我尝试过的:

我的
窗口
工作者
线程定义如下:

class Window(QWidget):
    def __init__(self, parent = None):
        QWidget.__init__(self, parent)
        self.thread = Worker()

        start = QPushButton("Start", self)
        QObject.connect(start, SIGNAL("clicked()"), MAIN_WORLD.begin)

        hbox = QVBoxLayout(self)
        hbox.addStretch(4)

class Worker(QThread):
    def __init__(self, parent = None):
        QThread.__init__(self, parent)

if __name__ == '__main__':
    MAIN_WORLD = World()
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
这似乎与在线示例非常相似。我的
World
类正在运行一个循环,该循环在用户单击“开始”直到再次单击之前是无限的。这里是它的部分定义

class World(QThread):
    def __init__(self, parent = None):
        QThread.__init__(self, parent)
        self.currentlyRunning = False
        //snip

    def begin(self):
        if self.currentlyRunning:
            self.currentlyRunning = False
        else:
            self.currentlyRunning = True
            self.MethodThatDoesUsefulStuff()

编辑:我注意到我并没有真正“使用”我的工作线程。如何将我的世界线程创建为工作线程

在仔细查看代码之后,您已经在QApplication之前启动了MAIN_WORLD,这不是您想要的

您希望执行以下操作:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    sys.exit(app.exec_())
在窗口类中:

class Window(QWidget):
    def __init__(self, *args):
        self.world_thread = World();
        # ...

上述操作将允许主线程控制gui,并允许工作线程在后台工作。

授予PyQt而不是PySide,但:

  • 不要子类QThread,子类QObject(请参阅)
  • 然后,基本工作流是创建一个新线程,将工作线程移动到该线程中,启动该线程和工作线程。你的问题可能是你从来没有真正启动过你的新线程,初始化不会这样做——然后你的GUI和你的工作人员都在运行同一个线程,正如其他人所评论的那样。吉尔并没有真正进入画面。请查看QThread文档:

在这种情况下,当其他代码运行时,如何保持GUI的一致响应?奇怪..我编辑了这篇文章来简要描述你们设计的后果。你能详细说明你的线程在做什么吗?我不熟悉生产者/消费者的问题,但它似乎不是这样。无限循环无限期地运行几代GA,直到GUI停止它。是的,这与生产者/消费者问题非常不同。我得听从别人。您可能能够在无限循环中调用
QApplication.processEvents()
,但我不确定这是否能在线程中工作(这确实是一个丑陋的黑客行为,而不是一个适当的修复)。这是错误的。GIL每100个Python ticks释放一次,不管它是否处于无限循环中。我建议看你在答案中链接的视频。