Соедините 2 сигнала/потока в одной функции с помощью signal/emitPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Соедините 2 сигнала/потока в одной функции с помощью signal/emit

Сообщение Anonymous »

Мое приложение зависит от получения результатов от двух разных потоков, которые отправляют целое число, если поток завершается. Я пытаюсь подключить функцию 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»