Raspi python多线程,我想继续引用一个全局变量
这是我的代码Raspi python多线程,我想继续引用一个全局变量,python,python-3.x,multithreading,raspberry-pi,Python,Python 3.x,Multithreading,Raspberry Pi,这是我的代码 RPi.GPIO是raspberrypi GPIO输入 多线程 导入线程 导入时间 进口测试剃须刀 全球电子邮件标志 电子邮件\u标志=0 def Mail(): 全球电子邮件标志 尽管如此: 打印(“邮件-翻到1”) email_flag=1 时间。睡眠(5) 打印(“邮件-翻到0”) 电子邮件\u标志=0 时间。睡眠(5) def razer(): 全球电子邮件标志 尽管如此: 时间。睡眠(1) 打印(“Razer reports标志为:”,email_标志) 测试剃须刀。剃须
RPi.GPIO
是raspberrypi GPIO输入
多线程
导入线程
导入时间
进口测试剃须刀
全球电子邮件标志
电子邮件\u标志=0
def Mail():
全球电子邮件标志
尽管如此:
打印(“邮件-翻到1”)
email_flag=1
时间。睡眠(5)
打印(“邮件-翻到0”)
电子邮件\u标志=0
时间。睡眠(5)
def razer():
全球电子邮件标志
尽管如此:
时间。睡眠(1)
打印(“Razer reports标志为:”,email_标志)
测试剃须刀。剃须刀(电子邮件标志)
线程\邮件=线程。线程(目标=邮件)
线程\u Mail.start()
thread\u razer=threading.thread(target=razer)
线程\u razer.start()
测试剃须刀
导入时间
def剃须刀(A1):
虽然(正确):
打印(“结果:%d”%A1)
时间。睡眠(1)
结果
Mail - flipping to 1
Razer reports flag as: 1
result: 1
result: 1
result: 1
result: 1
Mail - flipping to 0
result: 1
result: 1
result: 1
result: 1
result: 1
Mail - flipping to 1
result: 1
result: 1
result: 1
result: 1
我想要的是来自email\u标志的值被实时引用。
但是,仅在第一次调用函数时才引用该值。
while:razer(电子邮件标志)
是不允许的。在razer()
中,它加载树莓pi的模块,还有一个count
和while
语句。
似乎没有办法找到它。
我该怎么办
附言。
原始测试剃须刀
将RPi.GPIO导入为GPIO
进口VL53L1X
导入时间
导入系统
输入信号
从子流程导入调用
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
按下红色=22
推白=23
GPIO.setup(按下红色,GPIO.IN)
GPIO.setup(推白,GPIO.IN)
#
tof=VL53L1X.VL53L1X(i2c_总线=1,i2c_地址=0x29)
tof.open()
tof.start_rangin(1)
运行=真
def出口_处理器(信号,帧):
全球运行
运行=错误
豆腐,停止
打印()
系统出口(0)
def runtof(电子邮件\u标志、主\u标志):
计数=0
运行时:
如果GPIO.input(推送红色)==1或GPIO.input(推送白色)==1:
距离_in_mm=tof.get_距离()
打印(“距离:{}mm”。格式(距离单位:mm))#
如果0
您需要创建另一个模块来定义super
global,以便更好地描述
注意,您会注意到我并没有在您调用的地方调用test\u razer.razer()
,因为test\u razer.razer()
本身执行无限的循环。相反,我给它,它自己的线程。否则,main的razer例程将只执行一次
配置变量py
email_flag = 0
test_razer.py
import time
import config_var
def razer():
while(True):
print("Test Razer reports: %d"%config_var.email_flag)
time.sleep(0.5)
main.py
import threading
import time
import config_var
import test_razer
def Mail():
while True:
print("Mail - flipping to 1")
config_var.email_flag = 1
time.sleep(5)
print("Mail - flipping to 0")
config_var.email_flag = 0
time.sleep(5)
def razer():
while True:
time.sleep(1)
print("Razer reports flag as:",config_var.email_flag)
#test_razer.razer()
thread_Mail = threading.Thread(target=Mail)
thread_Mail.start()
thread_razer = threading.Thread(target=razer)
thread_razer.start()
thread_test_razer = threading.Thread(target=test_razer.razer)
thread_test_razer.start()
结果:
Mail - flipping to 1
Test Razer reports: 1
Test Razer reports: 1
Razer reports flag as: 1
Test Razer reports: 1
Test Razer reports: 1
Razer reports flag as: 1
Test Razer reports: 1
Test Razer reports: 1
Razer reports flag as: 1
Test Razer reports: 1
Test Razer reports: 1
Razer reports flag as: 1
Test Razer reports: 1
Test Razer reports: 1
Mail - flipping to 0
Razer reports flag as: 0
Test Razer reports: 0
Test Razer reports: 0
Razer reports flag as: 0
Test Razer reports: 0
Test Razer reports: 0
Razer reports flag as: 0
Test Razer reports: 0
Test Razer reports: 0
Razer reports flag as: 0
即兴演出~
????还有一个额外的WTH!对于razer()
(或者是rager()
?)中的无休止的递归。好的,我上传了完整的代码,请检查它的拼写错误!谢谢,修正了代码中的错误。此代码在按下按钮之前工作正常。可能很奇怪,因为我的英语不好。是的,我考过了。然后尝试修复。谢谢,但当我按下按钮时它不会“睡眠”。。所以我在raspii中得到一个i/0错误,我将上传结果显示。我上传结果。@toy339更新的代码仍然可疑。什么是self
作为函数razer
和Mail
的参数,为什么razer
在定义为razer(self)
时用razer(email\u flag,main\u flag)
调用自己,为什么razer
什么都不做而是调用自己。我应该指出,除非你有一个树莓圆周率,完整的代码是不可能测试的。这就是为什么这么说的原因,我真的很抱歉。我犯了一个错误,因为我注册不久。我将参考您的代码,创建并上传问题所需的代码。很抱歉