使用多个线程多次调用一个方法

2023-12-02

我想要一个 LED 闪烁,同时我的 Raspberry 上正在做一些工作。我在 Python 脚本中使用 LED 线程。

初始代码:

import RPi.GPIO
import time
import threading

pinLED = 10
pinButton = 12

GPIO.setmode(GPIO.BOARD)
GPIO.setup(pinLED, GPIO.OUT)
GPIO.setup(pinButton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.output(pinLED, 0)

线程的方法:

working = False
def flash():
    status = 0
    while working:
        time.sleep(0.5)
        if status == 0:
            GPIO.output(pinLED, 1)
            status = 1
        else:
            GPIO.output(pinLED, 0)
            status = 0|
    GPIO.output(pinLED, 0)

Logic:

try:
    while True:
        time.sleep(0.02) #found out that 0.02 is a good value to get every tiny button push and save resources

        if GPIO.input(pinButton) == 1:
            t = threading.Thread(target=flash)
            working = True
            t.start()

            time.sleep(5) #work would be here
            working = False
            t.join()

except Exception as e:
    print(e)
finally:
    GPIO.cleanup()

当我启动脚本并第一次按下按钮时,一切正常并且 LED 闪烁。但是当我第二次按下按钮时,没有重新启动脚本,LED 不闪烁。我打印了一些调试消息,发现 t.start() 被调用,但由于某种原因它什么也没做,也没有抛出异常。每次我再次按下按钮时 LED 不应该开始闪烁吗?


我发现没有logic故障,我确认它有效,但使用了以下更改:

  1. 开始main_thread从内部if __name__ == '__main__':.
    我建议也全部搬走GPIO在这个里面调用block.

避免将启动时执行的代码放置在if __name__ == '__main__':

来自文档:主模块的安全导入 应使用 if __name__ == '__main__' 来保护程序的“入口点”:

  1. Added join() after working = False,这表明线程在再次启动之前已终止。

    working = False  
    t.join()  
    

我建议改变def flash(),到以下:
Using threading.Event()代替global Instance并将其与pinLED。 这概括了def flash(...)并允许其与不同的用途pinLED,甚至平行。 定义status as threading.local()线程安全,因此不同线程的实例值会有所不同。
例如:

def flash(pinLED, flashing):
    status = threading.local()
    status.LED = False
    while flashing.is_set():
        status.LED = not status.LED
        GPIO.output(pinLED, int(status.LED))
        time.sleep(0.5)

    GPIO.output(pinLED, 0)

更改为main_thread:

def main_thread():
    flashing = threading.Event()
    flashing.clear()

    try:
        while True:
            time.sleep(0.02)  
            if GPIO.input(pinButton) == 1:
                t = threading.Thread(target=flash, args=(pinLED, flashing,))
                flashing.set()
                t.start()

                time.sleep(2)  # work would be here

                flashing.clear()
                t.join()
    ...  

使用Python测试:3.4.2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用多个线程多次调用一个方法 的相关文章

随机推荐

  • char 类型乘以另一个 char

    C C 中两个字符相乘的结果是什么类型 unsigned char a 70 unsigned char b 58 cout lt lt a b lt lt endl prints 4060 means no overflow cout l
  • 查找字符串中重复字符的最长子串

    这是基础这个代码强制问题 我尽量不寻求有关 codeforces 问题的帮助 除非我真的真的陷入困境 而现在恰好就是这样 Your first mission is to find the password of the Martian d
  • glCopyTexImage2D 作为 glReadPixels (OpenGL ES) 的替代品

    我目前正在使用 OpenGL ES 游戏的屏幕截图glReadPixels 屏幕截图很棒 但是调用glReadPixels导致游戏中出现轻微卡顿 glCopyTexImage2D已被建议作为更有效的替代品glReadPixels 如何glC
  • 如何获取QTableView右键索引

    下面的代码创建一个带有QTableView看法 左键单击onLeftClick函数获取 QModelIndexindex 该 QModelIndex 稍后用于打印左键单击单元格的行号和列号 如何获得QModelIndex右键单击的单元格的索
  • ffmpeg:编辑元数据并自动增加其名称+根据“名称”设置“标题”的值

    此 PowerShell 代码分割了一个大的音频文件 sound1 在 5 分钟内将它们保存为sound100 1 mp3 sound1 002 mp3 ffmpeg i file name complete f segment segme
  • 从 Bool 数组返回索引值数组,其中 true

    任何人都知道一种从值为 true 的布尔数组返回索引值数组的优雅方法 例如 let boolArray true true false true 这应该返回 0 1 3 let boolArray true true false true
  • 带图像的 Foreach 循环

    我有一个 80 PNG 图像序列 我试图在其中为我的 Windows 应用程序创建动画 文件路径是 Assets Star 我试图弄清楚如何为文件夹中的每个图像创建 foreach 循环 因此它将图像对象设置为 Image1 然后在计时器经
  • 为什么我的 div 的边距会受到其内部内容/块的影响?

    我有以下内容 div p some content p div or div some content div 没有 p some content p div的定位不同 看起来 div 内的块内容正在影响 div 的外 顶部 边距 那么di
  • 将 Pandas 数据框放入现有 Excel 工作表

    有没有办法将数据框放入现有的 Excel 工作表中 我有一个数据框 需要将其复制到特定的 Excel 工作表中的特定位置 单元格 A2 这样它将镜像 粘贴 整个数据框 从选定的单元格 如图所示 开始 包括下面的单元格 这样我就不必一一为特定
  • 哪里可以获得 Eclipse 的 ADT 18?

    我的 eclipse 将 ADT 更新为 20 我认为这很糟糕 我想恢复到 18 但找不到从哪里下载 In here https dl ssl google com android eclipse 它仅提供版本 20 Thanks 下载此文
  • 使用 CSS,如何创建*粗*超过 1 像素的文本描边轮廓?

    下面是我用来制作 1px 文本描边轮廓的代码 但是如何使轮廓变粗呢 如果我只是将所有 1px 替换为 5px 结果看起来很疯狂 HTML div class element Hello div CSS element color white
  • 如何利用HTTP header XSS漏洞?

    假设一个页面只是打印 HTTP referer 标头的值 没有转义 因此 该页面容易受到 XSS 攻击 即攻击者可以使用包含类似内容的引用标头来制作 GET 请求 但如何才能真正使用它来攻击目标呢 攻击者如何使用该特定标头向目标发出特定请求
  • 为类型别名元组添加 Impl (f64, f64)

    我有一个自定义类型 Point type Point f64 f64 我想添加两个Point在一起 但我收到此错误 error E0368 binary assignment operation cannot be applied to t
  • 后续:从 lme4 中的 VarCorr 对象中提取名称并将其粘贴为列名称

    我正在跟进这个很好的答案 功能foo下面 取Name的列VarCorr fit 输出并使它们成为列名summary rePCA fit call 当我们输入时效果很好fm1 fm2 但我想知道为什么它失败了fm3 有解决办法吗 librar
  • 我有 recyclerview 和 searchview 如何发送有关我搜索的项目的详细信息数据

    我有带有 searchview 的 recyclerview 并且在 recyclerview 中选择项目时发送详细数据 问题是当我搜索项目并选择它时 详细信息数据不会更改总是出现第一个项目的详细信息数据 我如何发送有关我搜索的项目的详细数
  • 如何使实体只读?

    使用 JPA 使实体只读的正确方法是什么 我希望我的数据库表永远不会以编程方式修改 我想我明白我应该用以下方式锁定我的对象LockModeType READ 是否可以使用注释使我的实体在从数据库检索后直接锁定 或者我是否必须为该特定实体搞乱
  • 在查询结束之前开始查看查询结果

    假设我查询一个包含 500K 行的表 我想开始查看获取缓冲区中保存结果集的任何行 即使查询尚未完成 我想滚动浏览提取缓冲区 如果我滚动得太远 我想显示一条消息 例如 到达获取缓冲区的最后一行 查询尚未完成 当查询继续构建结果集时 可以使用
  • 类定义如何才能不占用内存呢?

    所以我读过this关于类定义是否占用内存以及this关于if函数占用内存 这是我不明白的 如果函数占用内存 或者它们的代码占用内存 类定义为什么不占用内存 我的意思是 类定义也是代码 所以它不应该像函数代码一样占用内存吗 说类定义不占用内存
  • 在R中打印unicode字符串

    我输入了一个文本字符串 csvfile 其中包含 unicode 符号 如下所示 U00B5克 分升 在 csv文件以及在 R 数据帧中读取 test read csv test csv U00B5将产生微符号 R 按原样将其读入数据文件
  • 使用多个线程多次调用一个方法

    我想要一个 LED 闪烁 同时我的 Raspberry 上正在做一些工作 我在 Python 脚本中使用 LED 线程 初始代码 import RPi GPIO import time import threading pinLED 10