環境
raspberry pi 3 B
python 3.x
PyQt5
###質問内容
QTheadの使用方法について、
Qtheadでサブスレッドを作成し関数を実行してる際、メインスレッドからセンサの取得情報を渡すことは可能でしょうか?
作成してみたコード
コードについて、おかしいところや気持ちの悪いところ(def auto(self)の中身等)ありますが、気にしないでください。
python
1import sys 2from PyQt5.QtWidgets import * 3from PyQt5.QtGui import * 4from PyQt5.QtCore import * 5import subprocess 6import time 7import numpy as np 8import cv2 9import RPi.GPIO as GPIO 10 11 12Shoden_PIN=22 13 14Motor_PIN_1=24 15Motor_PIN_2=25 16 17Reed_PIN_1=17 18Reed_PIN_2=27 19 20GPIO.setmode(GPIO.BCM) 21GPIO.setup(Shoden_PIN, GPIO.IN) 22GPIO.setup(Reed_PIN_1, GPIO.IN) 23GPIO.setup(Reed_PIN_2, GPIO.IN) 24 25def setMotor(): 26 GPIO.setmode(GPIO.BCM) 27 GPIO.setup(Motor_PIN_1, GPIO.OUT) 28 GPIO.setup(Motor_PIN_2, GPIO.OUT) 29 30def Motor_Forward(): 31 GPIO.output(Motor_PIN_1, 1) 32 GPIO.output(Motor_PIN_2, 0) 33 34def Motor_Backward(): 35 GPIO.output(Motor_PIN_1, 0) 36 GPIO.output(Motor_PIN_2, 1) 37 38def Motor_Stop(): 39 GPIO.output(Motor_PIN_1, 0) 40 GPIO.output(Motor_PIN_2, 0) 41 42def Clean(): 43 GPIO.cleanup(24) 44 GPIO.cleanup(25) 45 46 47class Tab1Widget(QWidget): 48 49 def __init__(self, parent=None): 50 super().__init__(parent) 51 52 self.qt_thread = None 53 #self.running = False 54 self.title = "GUI test" 55 self.left = 10 56 self.top = 10 57 self.width = 640 58 self.height = 480 59 self.initUI() 60 self.counter = 0 61 62 def initUI(self): 63 64 65 btn1 = self.auto_button = QPushButton("自動", self) 66 btn2 = self.stop_button = QPushButton("停止", self) 67 68 btn1.clicked.connect(self.auto ) 69 btn2.clicked.connect(self.stop ) 70 71 self.textbox4 = QLineEdit(self) 72 73 74 label3 = QLabel("自動ドア") 75 label4 = QLabel("ドアの状態") 76 77 #GUIのレイアウト(省略) 78 79 def closeEvent(self, event): 80 self.stop() 81 82 if self.qt_thread: 83 self.qt_thread.wait(2000) 84 85 super().closeEvent(event) 86 87 def stop(self): 88 if self.qt_thread: 89 self.qt_thread.requestInterruption() 90 91 92 93 def setCount(self, alpha): 94 self.textbox4.setText("{}".format(alpha)) 95 96 97 def auto(self): 98 99 class MyQtThread(QThread): 100 101 sendString = pyqtSignal(str) 102 103 def run(self): 104 while 1: 105 if self.isInterruptionRequested(): 106 break 107 108 if GPIO.input(Shoden_PIN)==GPIO.HIGH: #物体検知 109 door="OPENED" 110 self.sendString.emit(door) 111 setMotor() 112 Motor_Forward() #ドアが開く 113 114 while 1: 115 116 if self.isInterruptionRequested(): 117 return 118 119 if GPIO.input(Reed_PIN_2)==GPIO.HIGH: #ドアが開ききる 120 Motor_Stop() 121 time.sleep(1) 122 123 if self.isInterruptionRequested(): 124 return 125 126 Motor_Backward() #ドア閉まる 127 128 while 1: 129 if self.isInterruptionRequested(): 130 return 131 132 if GPIO.input(Reed_PIN_1)==GPIO.HIGH: #ドアが閉まりきる 133 Motor_Stop() 134 door="CLOSED" 135 self.sendString.emit(door) 136 time.sleep(1) 137 break 138 139 else: 140 pass 141 142 break 143 144 else: 145 pass 146 break 147 148 else: 149 pass 150 151 Clean() 152 153 154 thread = self.qt_thread = MyQtThread() 155 156 thread.sendString.connect(self.setCount) 157 158 self.stop_button.clicked.connect(self.stop) 159 160 thread.finished.connect(lambda: print("Qt Thread Finished")) 161 thread.start() 162 163 164if __name__ == "__main__": 165 app = QApplication(sys.argv) 166 ex = Tab1Widget() 167 sys.exit(app.exec_())
行いたいこと
上のコードでは、すべての動作(センサからの情報取得、モーターの駆動)をサブスレッド内に入れています。
私の行いたいことは、「メインスレッドでQTimerを用いて、常にセンサ情報を取得、それをサブスレッドへ渡してサブスレッドでモーターを回す」ということです。
QTheadでメインスレッドとサブスレッドの情報の受け渡しは可能なのでしょうか?
どうか、ご教授お願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/02 09:18