2016-12-06 1 views
1

私は楽しいためにPythonを学んでいます。私がここで達成しようとしているのは、While Trueループを通して入力を求めているプログラムで、他のスクリプトをバックグラウンドで実行中です。(ユーザが選択)Python:ユーザの入力を受けながらスレッドを実行する

私は現在、うまくいきます...しかし、私が欲しかったのと全く同じです。ユーザーの入力を受け取り、askのようなスレッドを開始しますが、ユーザーの次の入力を待っている間にスレッドを一時停止します。次に、私のスレッドが毎秒印刷するものを出力しますが、コンソールの次の印刷後には1回だけ印刷します。

IDLEを使用してコードを定期的にテストしていますが、おそらくそれが役立つかもしれません。

校長スクリプト

from mythreadclass import MyThread 

while True: 
    user_input = input("What do I do ? ") 

    if user_input == "start thread": 
     #Will start a threat that prints foo every second. 
     mythread = MyThread() 
     mythread.start() 

    elif user_input == "hello": 
     print("Hello !") 

    else: 
     print("This is not a correct command.") 

Threadクラス

import time 
from threading import Thread, Timer 

class MyThread(Thread): 
    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print("Thread started !") 
     while True: 
      self.foo() 
      time.sleep(1) 

    def foo(self): 
     print("foo !") 

を実行するときに私が持っているもの:

What do I do ? 
>>> start thread 
Thread started ! 
What do I do ? 
>>> hello 
foo !Hello ! 
>>> hello 
foo !Hello ! 

ご覧のとおり、スレッドは、毎秒foo!を出力し、次の入力を依頼します。代わりに、スレッドを開始し、ユーザーが何かを入力したときにのみfoo !を出力します。入力はスレッドを一時停止/ブロックします。私が達成したいことは明らかである場合、私は知らない

のでは、ここではそれがです:あなたは、スレッドが間違ってやっている

What do I do ? 
>>> start thread 
Thread started ! 
What do I do ? 
foo ! 
foo ! 
foo ! 
#User waited 3 seconds before typing hello so there should be 3 foos 
>>> hello 
Hello ! 
What do I do ? 
foo ! 
foo ! 

etc etc. 
+0

私はraw_input' 'にそれ' input'を変更し、すべてでは期待通りに動作するようです。そして私はすべてを1つのファイルに入れます。 – sal

+0

ここに書かれている方法は、python 3.5で私にとって完璧に動作します。これはまさにあなたが書いたものなのでしょうか? –

+0

@JustinBellそれは_(非常に)_単純な例ですが、私のプロジェクト全体が全体的に同じです(他のファイルにスレッドをキャストするプリンシパルクラス) – sohomangue

答えて

-1

。代わりに、無限再帰の、run()メソッドは、そのような無限ループにする必要があります

from threading import Thread 
import time 

class MyThread(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
     self.start() 

    def run(self): 
     while (True): 
      self.foo() 
      time.sleep(1) 

    def foo(self): 
     print("foo !") 

my = None 

while True: 
    user_input = raw_input("What do I do ? ") 

    if user_input == "start thread": 
     #Will start a threat that prints foo every second. 
     if my == None: 
      print("Starting thread...") 
      my = MyThread() 
     else: 
      print("Thread is already started.") 

    elif user_input == "hello": 
     print("Hello !") 

    else: 
     print("This is not a correct command.") 
+0

無限回帰が最終的に問題(スタックオーバーフロー、便利にはP)につながる可能性はありますが、それは直ちに問題になるとは思わない@sohomangueは –

+0

です。これを直すでしょう!しかし、'time.sleep() 'を使用しても出力は変更されませんでしたが、プログラムは次のコンソールプリントが" foo! "を表示するのを待ちます。 1秒ごとに印刷するのではなく、 – sohomangue

+0

自分のコードを変更して、自分の望むように私のために機能します。 – Organis