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

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

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

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

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

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

Q&A

解決済

2回答

1666閲覧

pythonの同期処理について(画面描画と通信を同期処理で行いたい)

yujin5296

総合スコア16

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

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

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

0グッド

1クリップ

投稿2020/05/13 01:49

編集2020/05/13 03:36

環境:python3.7 kivy1.11

表題の通り、ソケット通信の処理のループ待機と、kivyによる画面描画の処理を
同期処理にて行いたいと考えております。

main.pyにて通信のループを行い、screen.pyにて画面の処理を行っております。

各ファイル独自での実行は問題ありません。

一部分となってしまいますが、下記にコードを貼り付けます。
ご参照いただければと思います。

現状の実行結果は、main.pyの処理のループは動いていて
screen.pyの画面の処理が意図していない白い画面で止まってしまってそれ以上は動かない状況です。

同期処理でmainでループが動き、画面の処理も正常に動くようにするためのアドバイスを頂ければと思います。
よろしくお願いいたします。

**main.py** : : def main(): : : def screen(): ScreenApp() if __name__ == '__main__': thread_1 = threading.Thread(target=main) thread_2 = threading.Thread(target=screen) thread_1.start() thread_2.start()
**screen.py** : : class ScreenApp(App): def build(self): self.sm = ScreenManager() self.sm.add_widget(〇〇Screen(name='〇〇'))     :     : return self.sm if __name__ == '__main__': ScreenApp().run()
**main.py(.run() 追記)** : : def main(): : : def screen(): ScreenApp().run() if __name__ == '__main__': thread_1 = threading.Thread(target=main) thread_2 = threading.Thread(target=screen) thread_1.start() thread_2.start()

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

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

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

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

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

y_waiwai

2020/05/13 01:55

提示のコードではどういう不具合があるんでしょうか
yujin5296

2020/05/13 01:57

質問文にも記載しておりましたが、 現状の実行結果は、main.pyの処理のループは動いていて screen.pyの画面の処理が意図していない白い画面で止まってしまってそれ以上は動かない状況です。 以上です(質問文が読みづらく、申し訳ございません...)
guest

回答2

0

screen.py が main.pyから呼ばれて起動することが前提であれば、このソースではScreenApp().run()が実行されないのが原因ではないでしょうか。

投稿2020/05/13 02:36

x98000

総合スコア1096

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

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

yujin5296

2020/05/13 03:42

ご回答ありがとうございます。 main.pyのscreen.py呼出部分に「.run()」を追記して動かしてみましたが、 処理が落ちるような動きをしてしまうようになりました。 先程までの動きから、処理が勝手に終了してしまうような動き方です。 screen.py側のScreenApp().run()を呼ぶ方法はあるのでしょうか? (if __name__ == '__main__':内の処理を呼び出す方法)
guest

0

自己解決

**main.py** if __name__ == '__main__': thread_1 = threading.Thread(target=main) thread_2 = threading.Thread(target=screen) thread_1.start() # thread_2.start() thread_2.run()

main.pyにて
thread_2.start()
この記述を
thread_2.run()
上記、記述に変更し期待通りの動きになりました。

投稿2020/05/13 03:51

yujin5296

総合スコア16

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

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

teamikl

2020/05/13 06:59

thread_2.run() は実質スレッドを使ってません。 スレッドで呼ばれるはずだったメソッドを、 メインスレッドで自分で呼んでいることになります。 thread_2.run() -> screen() でも同じ結果になるはずです。 kivy に限らず、GUI のイベントループ(この場合ScreenApp().run()) はメインスレッドで動かした方が良いです。 メインスレッドで他の処理をする必要がある場合は、(コンソール入力等) screen()は、スレッドではなく別プロセスにします。
teamikl

2020/05/13 07:01

解決策としては、期待通りであればそれでよいと思いますが、 thread2が不要なので、直接記述してメインスレッド上で 動作してる事を明示した方が良いと思います。 thread_1.start() ScreenApp().run()
yujin5296

2020/05/13 08:12

ご丁寧な解説、ありがとうございます。 とてもよく分かりました。 アドバイス頂いた記述に修正したいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問