完整的python新手...我正在使用Arduino pyfirmata软件包,我正在尝试做一些非常简单的事情。
取决于用户对python的输入,我希望LED闪烁还是不闪烁。
我的问题是python程序仅要求用户输入一次,但我希望它始终要求输入,以便用户可以随时更改功能。
我曾尝试使用线程包,但没有成功...也许有一种更简单的方法,但是我对编码是完全陌生的,因此我一无所知。欢迎提出建议!
这是我的代码,
import pyfirmata
import threading
import time
board = pyfirmata.Arduino('/dev/cu.usbmodem14101')
def flash():
for i in range(1000):
board.digital[13].write(1)
time.sleep(1)
board.digital[13].write(0)
time.sleep(1)
def stop():
board.digital[13].write(0)
while True:
runMode = input("Run or Stop? ")
if runMode == "Run":
x = threading.Thread(target=flash(), args=(1,))
x.start()
# x.join()
elif runMode == "Stop":
x = threading.Thread(target=stop(), args=(1,))
x.start()
#x.join()
如果您只是想杀死线程,可以使用多线程处理一个multiprocessing.Process可以p.terminate()
p = Process(target=flash, args=(,))
while True:
runMode = input("Run or Stop? ")
if runMode == "Run":
p.start()
elif runMode == "Stop":
p.terminate()
但是不建议您仅仅杀死线程,因为如果该进程正在处理关键资源或依赖于其他线程,则可能导致错误,请参见此处以获得更好的解释Is there any way to kill a Thread?
这里描述的更好的选择是使用标志来处理您的闪烁,它们允许线程之间的简单通信
from threading import Event
e = event()
def check_for_stop(e):
while not e.isSet():
flash()
print("Flashing Ended")
while True:
runMode = input("Run or Stop? ")
if runMode == "Run":
x = threading.Thread(target=check_for_stop, args=(e,))
x.start()
# x.join()
elif runMode == "Stop":
e.set() #set flag true
e.clear() #reset flag
这里是有关事件对象https://docs.python.org/2.0/lib/event-objects.html的更多信息的文档”>
我还没有测试这段代码只是一个示例,如果不能立即使用,请您道歉
编辑:只要再次查看您的函数,您就想在闪烁期间检查标志,这就是我的错误道歉,因此您的Flash函数看起来像
def flash(): while e.isSet(): board.digital[13].write(1) time.sleep(1) board.digital[13].write(0) time.sleep(1)
您将像以前一样将其传递给线程
x = threading.Thread(target=flash(), args=(1,))
x.start()
您在代码中出错。
您可以通过创建自己的Thread
子类,例如下面的Flasher
类,以面向对象的方式进行操作。