我们有一个执行不同查询的应用程序。它启动了最多四个线程,并在其中运行提取操作。
代码如下:
```python # 开始执行查询 for i in range(4): t = Thread(target=execute_query) t.start() ```
以上是指定四个线程来执行查询的部分代码。
我们的
如何在某个特定点暂停线程,显示窗口(我相信这将返回到主线程),然后返回到工作线程,传递单击的按钮事件?我读了一些关于信号的内容,但由于这是我第一次处理线程,所以似乎有点困惑。
编辑:阅读了这个问题:类似的问题之后,我将代码修改为以下内容:
在Cont类中的一个方法上
代码如下:
```python # 开始执行查询 for i in range(4): t = Thread(target=execute_query) t.start() ```
以上是指定四个线程来执行查询的部分代码。
if len(self.threads) == 4:
self.__maxThreadsMsg(base)
return False
else:
self.threads.append(Extractor(self.ui, base))
self.threads[-1].start()
self.__extractionMsg(base)
return True
我们的
Extractor
类继承了QThread
类:class Extractor(QThread):
def init(self, ui, base):
QThread.__init__(self)
self.ui = ui
self.base = base
def run(self):
self.run_base(base)
并且self.ui
被设置为Ui_MainWindow()
:
class Cont(QMainWindow):
def __init__(self, parent=None):
QWidget.__init__(self,parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
有一个特定的基地会在继续之前向用户发送数据(返回到主窗口),在这种情况下,是一个带有两个按钮的弹出窗口:
#This code is in the main file inside a method, not in the Extractor class
msg_box = QMessagebox()
msg_box.setText('Quantity in base: '.format(n))
msg_box.setInformativeText('Would you like to continue?')
msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
signal = msg_box.exec_()
如何在某个特定点暂停线程,显示窗口(我相信这将返回到主线程),然后返回到工作线程,传递单击的按钮事件?我读了一些关于信号的内容,但由于这是我第一次处理线程,所以似乎有点困惑。
编辑:阅读了这个问题:类似的问题之后,我将代码修改为以下内容:
在Cont类中的一个方法上
thread = QThread(self)
worker = Worker()
worker.moveToThread(thread)
worker.bv.connect(self.bv_test)
thread.started.connect(worker.process()) # This, unlike in the linked question..
#doesn't work if I remove the parentheses of the process function.
#If I remove it, nothing happens and I get QThread: "Destroyed while thread is still running"
thread.start()
@pyqtSlot(int)
def bv_test(self, n):
k = QMessageBox()
k.setText('Quantity: {}'.format(n))
k.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
ret = k.exec_()
return ret
这是 Worker
类:
class Worker(QObject):
#Signals
bv = pyqtSignal(int)
def process(self):
self.bv.emit(99)
现在我只需要弄清楚如何将ret
值发送回工作线程,以便启动第二个进程。我还一直遇到这个错误:
TypeError: connect()插槽参数应该是可调用的或信号,而不是'NoneType'