gpt4 book ai didi

python - 阻塞 QThread 阻塞 GUI

转载 作者:行者123 更新时间:2023-11-28 21:28:07 32 4
gpt4 key购买 nike

对于一个简单的聊天程序,我使用了一个通过 boost::python 包装的 c 库。

使用 PyQT 编写了一个简单的 GUI。接收消息是通过阻塞调用完成的lib说。对于独立刷新的 GUI,通信部分在 QThread 中。

虽然我假设 GUI 和通信是独立的,但 GUI 极度无响应并且似乎只在消息传入时更新。

#!/usr/bin/env python

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *

import pynetcom2
import time


class NetCom(QThread):

def __init__(self):
QThread.__init__(self)
self.client = pynetcom2.Client()
self.client.init('127.0.0.1', 4028)
self.client.provide('myChat', 1)
self.client.subscribe('myChat', 100)

def run(self):
while (1):
print "Waiting for message..."
text = self.client.recvStr('myChat', True)
return



class Netchat(QMainWindow):

def __init__(self, argv):

if (len(argv) != 2):
print "Usage: %s <nickname>" %(argv[0])
sys.exit(1)
self.nickname = argv[1]
print "Logging in with nickname '%s'" %(self.nickname)

super(Netchat, self).__init__()
self.setupUI()

rect = QApplication.desktop().availableGeometry()
self.resize(int(rect.width() * 0.3), int(rect.height() * 0.6))
self.show()

self.com = NetCom()
self.com.start()

def setupUI(self):
centralWidget = QWidget()
self.setCentralWidget(centralWidget)

self.testList = QListWidget()

mainLayout = QHBoxLayout()
mainLayout.addWidget(self.testList)
centralWidget.setLayout(mainLayout)

if __name__ == "__main__":
app = QApplication(sys.argv)
netchat = Netchat(sys.argv)
app.exec_()

最佳答案

这可能是由臭名昭著的全局解释器锁 (GIL) 引起的。 Python 不允许两个线程同时执行 Python 代码。在您的 C 函数中,如果您希望 GUI 代码并行运行,您必须显式释放并重新获取 GIL。

这在 Python C API 文档中有解释:Thread State and the Global Interpreter Lock .

它归结为在您的 C 扩展中使用以下宏:

Py_BEGIN_ALLOW_THREADS

// Your expensive computation goes here.

Py_END_ALLOW_THREADS

关于python - 阻塞 QThread 阻塞 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9033194/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com