質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1868閲覧

Pyside2 QThreadの使用方法について教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/05 14:33

pythonでプログラミング歴が約2年の者です。まだまだ駆け出しでして、知識豊富な方に助言を頂きたく書き込みをしました。

プログラムの挙動
センサーから0.4sおきに測定結果を収集しており、閾値を超えた場合にアラーム音を鳴らすプログラムです。

質問内容
Qthredを利用し、アラーム音が鳴っている間も、センサーからの測定結果をUIの画面に表示したいのですが、アラーム音が鳴っている間はUIの更新ができません。
いろいろ調べてみたのですが、ノンブロッキング処理や非同期処理を利用するらしいのですが、pyside2のQThredでもこれと似たような方法ができませんでしょうか。

ご存知の経験豊富な先輩方で、方法をご存じの場合には添えていただけませんでしょうか

よろしくお願いいたします。

# リミットスイッチがopenの時間を計測する # プレス機などに設置されているリミットスイッチに利用 # 起動後 Start the Monitoring のボタンを押してプログラムを開始できる # 修了時はExit the Program のボタンを押してプログラムを終了する # 結果は C:\CT.csv に保存されている import sys from PySide2.QtWidgets import * from PySide2.QtCore import QTimer, QObject, Signal, Slot, QThread import time import datetime import csv from playsound import playsound import asyncio import mitutoyo # グローバル関数 経過時間の格納に利用 list_start = [] list_end = [] # csvファイルの保存先 file_path = "c://結果.csv" # リミットスイッチのON/OFFの判定用閾値 threshold = 0.040 sound01 = "D:\0.010.wav" class Main(QWidget): def __init__(self, parent=None): super().__init__(parent) #self.qtthread = None ??? self.initUI() # UIに関する設定 def initUI(self): # プログラムスタートボタン self.btn01 = self.auto_button = QPushButton("開始", self) self.btn01.clicked.connect(self.start_main) self.btn01.move(0, 0) self.btn01.resize(200, 50) # プログラムを閉じるボタン self.btn01 = self.auto_button = QPushButton("停止", self) self.btn01.clicked.connect(self.exit_main) self.btn01.move(0, 50) self.btn01.resize(200, 50) # CTの表示 self.ct_label = QLabel("", self) self.ct_label.move(900, 0) self.ct_label.resize(400, 100) self.style = ("font-size: 128px;") self.ct_label.setStyleSheet(self.style) # Status Barの表示 self.status_bar01 = QLabel("", self) self.status_bar01.move(0, 110) self.status_bar01.resize(2000,2000) self.show() # LCD表示 def lcd(self, aaa): self.value = (str("{}".format(aaa))) self.ct_label.setText(self.value) self.styleA = "QWidget{background-color:%s}" % ("green" if float(self.value) < threshold else "brown") self.status_bar01.setStyleSheet(self.styleA) # 警告音 def sound(self, aaa): self.value = (str("{}".format(aaa))) print(self.value) #self.ct_label.setText(self.background) if "異常発生" in self.value: return elif 0.009 < float(self.value): playsound(sound01) # メインプログラム def start_main(self): # thread処理 class Thread(QThread): send_value = Signal(str) # whileループでGPIO8のシグナルを監視 def run(self): while True: self.value = mitutoyo.mitutoyo() self.send_value.emit(self.value) f = open(file_path, 'a') writer = csv.writer(f, lineterminator='\n') # サイクルタイムの時間を記録 self.dt = datetime.datetime.now() self.dt1 = self.dt.strftime('%Y/%m/%d') self.dt2 = self.dt.strftime('%H:%M:%S') csvlist = [self.dt1, self.dt2, self.value] writer.writerow(csvlist) f.close() time.sleep(0.4) # thread処理+connect thread = self.qtthread = Thread() thread.send_value.connect(self.sound) thread.send_value.connect(self.lcd) thread.start() # exitが押された場合プログラム強制終了 def exit_main(self): sys.exit() if __name__ == '__main__': app = QApplication(sys.argv) #不明。実行には必ず必要 #stylesheetに関する設定 #app.setStyleSheet(style2) main_window = Main() #class Ppf()を表示 main_window.setWindowTitle("歪 アラーム Ver.0.0.1") #windowのtitle #main_window.setFixedSize(300, 200) #ソフトのサイズとサイズの固定 main_window.showMaximized() #ソフトのサイズとサイズの固定 app.exec_() #不明。実行には必ず必要

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

QThreadを使ったことはありませんが、おそらくグローバルインタプリタロック (Global Interpreter Lock)に関する問題だと思います。

公式ドキュメント ライブラリと拡張 FAQ グローバルインタプリタロック (Global Interpreter Lock) を取り除くことはできないのですか?をお読みください。

別プロセスにすれば解決するのですが、Pyside2にそういう機能があるかどうかは知りません。multiprocessing --- プロセスベースの並列処理を使って、別プロセスを作る必要があるかもしれません。

投稿2022/01/05 14:49

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/09 16:49

教えていただきましてありがとうございます。 multiprocessing を実装に成功しました。 またわからないことがある場合には教えていただくかもしれません。 その際はよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問