Мое приложение зависит от получения результатов от двух разных потоков, которые отправляют целое число, если поток завершается. Я пытаюсь подключить функцию thrid в родительском классе таким образом, чтобы она вызывалась каждый раз, когда посылаются оба сигнала. Значения хранятся в очереди родительского класса.
Вот минимальный рабочий пример того, чего я хочу достичь. self.number используется для отслеживания вызова функции. Проблема в том, что Does_something вызывается для обоих потоков отдельно, хотя предполагается, что он вызывается только один раз и принимает оба сигнала. Я надеюсь, что это ясно описывает мою проблему, помощь очень признательна.
Одна важная вещь, на которую следует обратить внимание: в моем приложении рабочий поток содержит цикл while, который выполняется непрерывно для сбора данных из камера. Важно, чтобы этот цикл не завершался, поэтому использование .join() недопустимо, поскольку рабочий процесс никогда не завершается, пока программа работает
# -*- coding: utf-8 -*-
from queue import Queue
import sys
from PyQt5 import QtCore as qtc
import numpy as np
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget
class WorkerSignals(qtc.QObject):
finished = qtc.pyqtSignal()
error = qtc.pyqtSignal(int)
result = qtc.pyqtSignal(object)
class MainWindow(QMainWindow):
def __init__(self,*args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.threadpool = qtc.QThreadPool()
## number that checks number of function call
self.number = 0
self.queue_one = Queue()
self.queue_two = Queue()
self.setWindowTitle("Does something")
self. pagelayout = QVBoxLayout()
self.boxlayout = QVBoxLayout()
self.pagelayout.addLayout(self.boxlayout)
self.button = QPushButton("Does something")
self.lable = QLabel('Says something')
self.boxlayout.addWidget(self.button)
self.boxlayout.addWidget(self.lable)
# self.setCentralWidget(self.boxlayout)
self.button.clicked.connect(self.start_thread)
self.widget = QWidget()
self.widget.setLayout(self.pagelayout)
self.setCentralWidget(self.widget)
def start_thread(self):
worker_one = Emits_something(self.queue_one)
worker_two = Emits_something(self.queue_two)
worker_one.signals.finished.connect(self.does_something)
worker_two.signals.finished.connect(self.does_something)
self.threadpool.start(worker_one)
self.threadpool.start(worker_two)
def does_something(self):
print(self.number)
self.number +=1
if not self.queue_one.empty() and not self.queue_two.empty():
val_one = self.queue_one.get()
val_two = self.queue_two.get()
self.lable.setText(f"{val_one+val_two}")
class Emits_something(qtc.QRunnable):
def __init__(self,queue, *args,**kwargs):
super(Emits_something, self).__init__(*args, **kwargs)
self.signals = WorkerSignals()
self.queue = queue
@qtc.pyqtSlot()
def run(self):
val = np.random.randint(0,21)
self.queue.put(val)
self.signals.finished.emit()
if __name__ =='__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
sys.exit(app.exec())
Подробнее здесь: https://stackoverflow.com/questions/785 ... gnals-emit
Соедините 2 сигнала/потока в одной функции с помощью signal/emit ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Соедините каждые два значения массива словом, а затем соедините эти строки запятой.
Anonymous » » в форуме Php - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Оператор Socketio.emit не обновляет браузер при вызове из функции, управляемой таймером
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-