QThread 和 queue
时间: 2023-11-01 15:07:49 浏览: 30
引用<span class="em">1</span>
#### 引用[.reference_title]
- *1* [QT QThread 线程间消息队列](https://blog.csdn.net/zsyddl2/article/details/80628621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关问题
在threading库中哪个函数与QThread库的invokeMethod相同
在 `threading` 库中没有与 `QThread` 类的 `invokeMethod` 方法完全相同的函数。`QThread` 类的 `invokeMethod` 方法是通过信号与槽机制来实现的,它可以将函数调用转移到主线程中。而在 `threading` 库中,通常使用 `queue` 模块来实现线程间通信。
如果你想在子线程中调用主线程中的函数,可以使用 `queue` 模块来实现。具体来说,你可以将函数调用打包成一个任务,然后将这个任务放入一个队列中,主线程从队列中获取任务并执行。以下是一个简单的示例代码:
```python
import threading
import queue
import time
def worker(queue):
while True:
# 从队列中获取任务
task = queue.get()
if task is None:
break
# 执行任务
func, args, kwargs = task
func(*args, **kwargs)
def main():
# 创建队列和线程对象
q = queue.Queue()
t = threading.Thread(target=worker, args=(q,))
t.start()
# 在子线程中调用主线程的函数
q.put((update_label, ("Hello, world!",), {}))
time.sleep(1)
# 结束线程
q.put(None)
t.join()
def update_label(text):
# 在主线程中更新标签的文本
print(text)
if __name__ == "__main__":
main()
```
在上面的代码中,`worker` 函数是子线程的主函数,它从队列中获取任务并执行。在 `main` 函数中,创建一个队列和一个线程对象,并启动线程。然后,在子线程中调用主线程的 `update_label` 函数,将 `"Hello, world!"` 作为参数传递给它。主线程通过 `print` 函数输出这个参数。最后,结束线程。
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtChart import * class RandomGenerator(QObject): dataReady = pyqtSignal(int) stopSignal = pyqtSignal() def init(self): super().init() self.queue = [] self.count = 0 def start(self): while True: val = random.randint(1, 100) if val < 50: self.queue.append(val) if len(self.queue) == 1: self.dataReady.emit(val) else: self.count += 1 if self.count >= 2: self.stopSignal.emit() break class ChartDrawer(QObject): finished = pyqtSignal() def init(self, queue): super().init() self.queue = queue self.series = QLineSeries() def start(self): while True: if len(self.queue) > 0: val = self.queue.pop(0) self.series.append(self.series.count(), val) else: break self.finished.emit() class MainWindow(QMainWindow): def init(self): super().init() self.generator = RandomGenerator() self.drawer = ChartDrawer(self.generator.queue) self.chartView = QChartView() self.chart = QChart() self.chart.addSeries(self.drawer.series) self.chart.createDefaultAxes() self.chartView.setChart(self.chart) self.startButton = QPushButton("Start") self.startButton.clicked.connect(self.start) self.stopButton = QPushButton("Stop") self.stopButton.clicked.connect(self.stop) self.stopButton.setEnabled(False) self.statusBar().showMessage("Ready") layout = QVBoxLayout() layout.addWidget(self.chartView) layout.addWidget(self.startButton) layout.addWidget(self.stopButton) widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) def start(self): self.statusBar().showMessage("Running") self.generatorThread = QThread() self.generator.moveToThread(self.generatorThread) self.generatorThread.started.connect(self.generator.start) self.generator.dataReady.connect(self.handleDataReady) self.generator.stopSignal.connect(self.handleStopSignal) self.generatorThread.start() self.drawerThread = QThread() self.drawer.moveToThread(self.drawerThread) self.drawer.finished.connect(self.handleDrawerFinished) self.drawerThread.start() self.startButton.setEnabled(False) self.stopButton.setEnabled(True) def stop(self): self.statusBar().showMessage("Stopping") self.generator.stopSignal.emit() self.generatorThread.quit() self.drawerThread.quit() self.startButton.setEnabled(True) self.stopButton.setEnabled(False) def handleDataReady(self, val): self.drawer.series.append(self.drawer.series.count(), val) def handleStopSignal(self): self.generatorThread.quit() def handleDrawerFinished(self): self.chartView.update() self.statusBar().showMessage("Finished") self.startButton.setEnabled(True) self.stopButton.setEnabled(False) if name == 'main': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) 请检查上述代码为何没有画图并展示
这段代码缺少了一些必要的部分,例如 `random` 模块的导入,以及 `RandomGenerator` 类中 `init` 方法的名称错误。此外,`ChartDrawer` 的构造函数应该接受 `queue` 参数并将其存储为实例属性。
另外,`MainWindow` 类中 `start` 方法的最后一行应该是 `self.chartView.show()`,而不是 `self.chartView.update()`。
以下是修改后的代码,应该可以正确地显示图表:
```
import random
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtChart import *
class RandomGenerator(QObject):
dataReady = pyqtSignal(int)
stopSignal = pyqtSignal()
def __init__(self):
super().__init__()
self.queue = []
self.count = 0
def start(self):
while True:
val = random.randint(1, 100)
if val < 50:
self.queue.append(val)
if len(self.queue) == 1:
self.dataReady.emit(val)
else:
self.count += 1
if self.count >= 2:
self.stopSignal.emit()
break
class ChartDrawer(QObject):
finished = pyqtSignal()
def __init__(self, queue):
super().__init__()
self.queue = queue
self.series = QLineSeries()
def start(self):
while True:
if len(self.queue) > 0:
val = self.queue.pop(0)
self.series.append(self.series.count(), val)
else:
break
self.finished.emit()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.generator = RandomGenerator()
self.drawer = ChartDrawer(self.generator.queue)
self.chartView = QChartView()
self.chart = QChart()
self.chart.addSeries(self.drawer.series)
self.chart.createDefaultAxes()
self.chartView.setChart(self.chart)
self.startButton = QPushButton("Start")
self.startButton.clicked.connect(self.start)
self.stopButton = QPushButton("Stop")
self.stopButton.clicked.connect(self.stop)
self.stopButton.setEnabled(False)
self.statusBar().showMessage("Ready")
layout = QVBoxLayout()
layout.addWidget(self.chartView)
layout.addWidget(self.startButton)
layout.addWidget(self.stopButton)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def start(self):
self.statusBar().showMessage("Running")
self.generatorThread = QThread()
self.generator.moveToThread(self.generatorThread)
self.generatorThread.started.connect(self.generator.start)
self.generator.dataReady.connect(self.handleDataReady)
self.generator.stopSignal.connect(self.handleStopSignal)
self.generatorThread.start()
self.drawerThread = QThread()
self.drawer.moveToThread(self.drawerThread)
self.drawer.finished.connect(self.handleDrawerFinished)
self.drawerThread.start()
self.startButton.setEnabled(False)
self.stopButton.setEnabled(True)
def stop(self):
self.statusBar().showMessage("Stopping")
self.generator.stopSignal.emit()
self.generatorThread.quit()
self.drawerThread.quit()
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
def handleDataReady(self, val):
self.drawer.series.append(self.drawer.series.count(), val)
def handleStopSignal(self):
self.generatorThread.quit()
def handleDrawerFinished(self):
self.chartView.show()
self.statusBar().showMessage("Finished")
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)