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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2690閲覧

スレッド内でQtimerが動作しない

mrhonen

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/08/12 13:00

編集2020/08/12 13:01

外部機器からデータをリアルタイムにインポートし、同時に解析・表示させるようなプログラムを作成しています。

python3.x

1def import_data(): 2 #データをインポートし格納する部分 3 #GUIをpyqt5, pyqtgraphで設定 4 5 timer = pyqtgraph.Qtcore.Qtimer() 6 timer.timmeout.connect(描画更新用関数) 7 timer.start(100)

 
といった関数を作成し、

python3.x

1thread = threading.Thread(target = import_data) 2thread.start

でスレッドを開始しています。
解決方法をご存知の方がいらっしゃいましたら、ご教授いただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

スレッドでQTimerを動作させるには、イベントループが必要なので、
QThread を使う必要があります。

QThread はスレッド毎に個別のイベントループを持ちます。

QThread の使い方は幾つかあるのですが、継承による方法ではなく
スレッドで処理したいことを行う worker を作成し、
moveToThread を使うアプローチを取ってください。

QThread - Detailed Description

サンプルコードを参考にする際は、古い情報に注意。

QThread は Pythonのスレッドと同じように継承でも使えるのですが、
継承による利用では、イベントループを呼び出す処理を上書きしてしまう為、
イベントループを必要とする処理、QTimer や、
一部スレッドに対するシグナル・スロットの利用に制限が掛かります。


また、Pythonのスレッド / QThread に限らず、
描画更新を別スレッドで直接行うのは問題があるので、

Pythonのスレッドを使う場合は、イベント等の通知の仕組み、
QThread を使う場合はシグナル・スロットを用いて、
描画の更新処理はメインスレッド側で行う必要があります。

追記: タイマーでは描画更新処理を直接行うのではなく、
スレッドではデータのみ読み出して、シグナルを発生させるようにします。
メインスレッド側では、そのシグナルに描画更新処理のスロットを接続します。

投稿2020/08/13 17:47

編集2020/08/15 01:46
teamikl

総合スコア8664

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

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

mrhonen

2020/08/15 05:05

データ収集用スレッドの中からシグナルを出してメインスレッドの描画スロットに接続し無事実装することができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問